LGP2490题解
有点儿神秘?
根据他这个题意说的,白子向右的第一个一定是对应的黑子啊。
所以棋子的绝对位置是不重要的,我们只需要考虑白子和黑子的相对位置,然后考虑用 GF 来拼凑状态就好了。
下面的 \(k\) 是题面中的 \(\frac{k}{2}\)。
这是一个 k-nim。\(k\) 堆石头每次最多选 \(d\) 堆。
先丢结论:设 \(x_i\) 为 \(x\) 在二进制下的第 \(i\) 位,那么先手必败的条件一定满足对于任意 \(i\) 有 \(\sum_{j=1}^k(x_j)_i \bmod(d+1)=0\)。
证明不会,只会感性理解(
很明显全 \(0\) 随便撤一步都不可能撤回全 \(0\) 的状态,只需要证明非全 \(0\) 是必胜即可。
而非全 \(0\) 明显是有办法撤到全 \(0\) 的。所以我们就成功感性理解了
注意到必败的方法比必胜的要好算,所以我们计算必败的方案。
根据这个我们就可以考虑 GF 了!!!!!!
我们设单块(一对黑白子)的 GF 为 \(F(x,y)\),那么有:
我们知道有 \(n-2k\) 个位置是空的,空格被黑白子分成了 \(k+1\) 段,那么我们再设一个:
我们有:
答案是
虽然看上去很奇怪,但是我们成功写成了 GF 的形式
我们先考虑 \(F^k\) 是个什么鬼东西:
前面 \(x^{2k}\) 可以直接丢掉了。
我们考虑一个很神秘的东西:对 GF 的指数进行 DP(?)
我们设一个 \(F_n(x,y)=\prod_{i=0}^n(\sum_{j=0}^k\binom{k}{j}x^{j2^{i}}y_i^j)\)。
再设一个 \(dp[t][n]=[x^n(\sum_{d+1|t_i,i\leq k}\prod y_i^{t_i})]F_{t-1}(x,y)\)。(这里 \(t-1\) 是为了避免 \(dp[0]\) 初始化有点麻烦)
我们似乎只需要求出 \(dp[\lfloor\log n\rfloor][0\sim n-2k]\) 即可?
然后好像把这个序列卷上一个组合数序列就行了。
转移很明显,根据定义直接卷上去就完了。
复杂度是 \(O(nk\log n)\),足以通过此题。
#include<cstdio>
typedef unsigned ui;
const ui M=10005,mod=1e9+7;
ui n,d,k,C[55],g[M],dp[17][M];
inline ui pow(ui a,ui b){
ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
inline ui binom(const ui&n,const ui&m){
ui x(1),y(1),z(1);
for(ui i=1;i<=n;++i)x=1ull*x*i%mod;
for(ui i=1;i<=m;++i)y=1ull*y*i%mod;
for(ui i=1;i<=n-m;++i)z=1ull*z*i%mod;
return 1ull*x*pow(1ull*y*z%mod,mod-2)%mod;
}
signed main(){
ui lgn(1),ans(0);
g[0]=g[1]=1;C[0]=C[1]=1;dp[0][0]=1;
scanf("%u%u%u",&n,&k,&d);++d;n-=k;k>>=1;
while((1<<lgn)<=n)++lgn;--lgn;
for(ui i=2;i<=n;++i)g[i]=1ull*(mod-mod/i)*g[mod%i]%mod;
for(ui i=1;i<=n;++i)g[i]=1ull*g[i]*g[i-1]%mod*(k+i)%mod;
for(ui i=2;i<=k;++i)C[i]=1ull*(mod-mod/i)*C[mod%i]%mod;
for(ui i=1;i<=k;++i)C[i]=1ull*C[i]*C[i-1]%mod*(k-i+1)%mod;
for(ui i=1;i<=lgn;++i){
for(ui j=0;j<=n;++j){
for(ui x=0;(x<<i-1)<=j&&x<=k;x+=d)dp[i][j]=(dp[i][j]+1ull*C[x]*dp[i-1][j-(x<<i-1)])%mod;
}
}
for(ui i=0;i<=n;++i)ans=(ans+1ull*dp[lgn][i]*g[n-i])%mod;
printf("%u",(mod+binom(n+(k<<1),k<<1)-ans)%mod);
}