关于去重部分。
std 的做法是直接把重复的情况单独算出来再减去。而我的做法是在计算的时候将两次重复的情况各算一半。为什么我的会过不了样例/kk。
代码如下:
void solve(void)
{
register int ans1=0,ans2=0;
for(register int i=0;i<=min(k,n);i++)
if((i^k^1)&1)
{
if(((n-i)^k^1)&1) ans1=(1ll*C(n,i)*inv[2]%MOD+ans1)%MOD;
else ans1=(1ll*ans1+C(n,i))%MOD;
}
for(register int i=0;i<=min(k,m);i++)
if((i^k^1)&1)
{
if(((m-i)^k^1)&1) ans2=(1ll*C(m,i)*inv[2]%MOD+ans2)%MOD;
else ans2=(1ll*ans2+C(m,i))%MOD;
}
printf("%lld\n",1ll*ans1*ans2%MOD);
}