SP19148 Kill them All
截止2020.4.27晚,另外的所有题解都有根本性问题(详情可以去讨论区)。
先来看一个简单版的问题:
[SCOI2010] 生成字符串
lxhgww 最近接到了一个生成字符串的任务,任务需要他把
n 个1 和m 个0 组成字符串,但是任务还要求在组成的字符串中,在任意的前k 个字符中,1 的个数不能少于0 的个数。现在 lxhgww 想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?
考虑一个转化,从
考虑怎么算这两部分。发现本质上从
再考虑这题:
[SP19148] Kill them All
$1\leq n\leq 10^6$ 。
回顾历史的时候顺便发现了这道题…
大概就是上个题把 Digo 干掉,那么就变成了从
其中第一个 Digo 干掉的方案数。那么可以知道…这个式子里面前面的都被消掉了,最后只剩一个
int t, n ;
int fac[N] ;
int inv[N] ;
int expow(int a, int b){
int ret = 1 ;
while (b){
if (b & 1)
ret = (ll)ret * a % P ;
a = (ll)a * a % P ; b >>= 1 ;
}
return ret ;
}
int binom(int x, int y){//\binom{x}{y}
return (ll)fac[x] * inv[y] % P * inv[x - y] % P ;
}
int main(){
fac[0] = inv[0] = 1 ; cin >> t ;
for (int i = 1 ; i <= M + 1 ; ++ i)
fac[i] = (ll)fac[i - 1] * i % P ;
inv[M + 1] = expow(fac[M + 1], P - 2) ;
for (int i = M ; i >= 1 ; -- i)
inv[i] = (ll)inv[i + 1] * (i + 1) % P ;
while (t --) n = qr(), printf("%d\n", binom(n - 1, ceil(1.0 * n / 2.0) - 1)) ;
}