LOJ6358 前夕
前夕
为了抵御以尼古拉奥尔丁为首的上古龙族的入侵,地球的守护者 Yopilla 集齐了 \(n\) 种人类文明的本源力量 —— 世界之力。
Yopilla 打算使用若干种技能来对抗尼古拉奥尔丁的进攻。每种技能由若干种世界之力构成。换句话说,一共有 \(2 ^ n\) 种技能,Yopilla 要使用若干种技能来对抗尼古拉奥尔丁。
大战前夕,Yopilla 走在波士顿的街头,突然看见天空中飞过了 \(4\) 只白鸽,他便洞察了战胜尼古拉奥尔丁的秘密:只要他使用的技能中,都含有的世界之力的种类数恰好为 \(4\) 的倍数,他便可以打败敌人。
Yopilla 想知道,他有多少种使用技能的情况,能战胜敌人。请你替 Yopilla 回答这个问题,答案对 \(998244353\) 取模即可。
对于所有数据,\(1 \le n \le {10} ^ 7\)。
题解
http://jklover.hs-blog.cf/2020/04/13/Loj-6358-前夕/#more
考虑容斥,钦定交集中包含了\(k\)个元素(实际包含了大于等于\(k\)个)的总方案数为
因为容斥系数不明显,所以考虑构造出容斥系数\(f\),使得
对于交集大小为\(x\)的某种方案,我们希望它被算\([x\bmod 4=0]\)次,而按照\(\text{ans}=\sum f(k)g(k)\)计算时,它实际上被算了\(\sum_{i=0}^x \binom x if(i)\)次。
于是可以得出\([x\bmod 4=0]=\sum_{i=0}^x \binom x i f(i)\)。
利用二项式反演和单位根反演可以得到
注意选择一个技能都没有的集合和一个集合都不选择是不同的方案。
而上述分析只考虑了前者的贡献,最后答案还要加上\(1\),表示一个集合都不选。
时间复杂度\(O(n)\)。
CO int N=1e7+10;
int fac[N],ifac[N];
int f[N],g[N];
IN int C(int n,int m){
return mul(fac[n],mul(ifac[m],ifac[n-m]));
}
int main(){
int n=read<int>();
fac[0]=1;
for(int i=1;i<=n;++i) fac[i]=mul(fac[i-1],i);
ifac[n]=fpow(fac[n],mod-2);
for(int i=n-1;i>=0;--i) ifac[i]=mul(ifac[i+1],i+1);
for(int i=n,k=2;i>=0;--i,k=mul(k,k))
g[i]=mul(C(n,i),k-1);
int w=fpow(3,(mod-1)/4);
for(int j=0,k=1;j<4;++j,k=mul(k,w))
for(int i=0,pw=1;i<=n;++i,pw=mul(pw,k-1))
f[i]=add(f[i],pw);
int ans=0;
for(int i=0;i<=n;++i)
ans=add(ans,mul(f[i],g[i]));
ans=mul(ans,fpow(4,mod-2));
printf("%d\n",ans+1);
return 0;
}