AT4996-[AGC034F]RNG and XOR【FWT,生成函数】
正題
題目鏈接:https://www.luogu.com.cn/problem/AT4996
題目大意
給出一個0~2n?10\sim 2^n-10~2n?1下標(biāo)的數(shù)組ppp,pip_ipi?表示有pip_ipi?的權(quán)重概率選擇iii。
開始有一個x=0x=0x=0,每次選擇一個數(shù)字yyy讓x=xxoryx=x\ xor\ yx=x?xor?y
對于每個iii求期望多久后第一次變成iii。
1≤n≤181\leq n\leq 181≤n≤18
解題思路
搞一個異或卷積的生成函數(shù),先搞出概率的函數(shù)PPP。
然后設(shè)EEE表示答案的函數(shù),那么有
E×P+I=E+cE\times P+I=E+cE×P+I=E+c
ccc表示余項,I(x)=∑i=1∞xiI(x)=\sum_{i=1}^{\infty}x^iI(x)=∑i=1∞?xi
先求出余項ccc來,設(shè)S(A)S(A)S(A)表示生成函數(shù)AAA的所有系數(shù)和
S(E)×S(P)+S(I)=S(E)+cS(E)\times S(P)+S(I)=S(E)+cS(E)×S(P)+S(I)=S(E)+c
S(P)=1S(P)=1S(P)=1,S(I)=2nS(I)=2^nS(I)=2n,那我們有c=S(I)=2nc=S(I)=2^nc=S(I)=2n
所以就有
E×P+I=E+2nE\times P+I=E+2^nE×P+I=E+2n
E×(P?1)=2n?IE\times (P-1)=2^n-IE×(P?1)=2n?I
FWT(E)=FWT(2n?I)FWT(P?1)FWT(E)=\frac{FWT(2^n-I)}{FWT(P-1)}FWT(E)=FWT(P?1)FWT(2n?I)?
然后跑FWTFWTFWT就好了。
注意跑出來的E0≠0E_0\neq 0E0??=0,我們要把所有的答案減去E0E_0E0?
時間復(fù)雜度O(2nn)O(2^nn)O(2nn)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1<<19,P=998244353; ll n,k,f[N],g[N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } void FWT(ll *f,ll op){for(ll p=2;p<=n;p<<=1){ll len=(p>>1);for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++){ll x=f[i],y=f[i+len];f[i]=(x+y)*op%P;f[i+len]=(x-y+P)*op%P;}}return; } signed main() {scanf("%lld",&k);n=1<<k;ll sum=0;for(ll i=0;i<n;i++){scanf("%lld",&f[i]);sum=(sum+f[i])%P;g[i]=P-1;}sum=power(sum,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*sum%P;g[0]=(g[0]+n)%P;f[0]=(f[0]+P-1)%P;FWT(f,1);FWT(g,1);for(ll i=0;i<n;i++)f[i]=g[i]*power(f[i],P-2)%P;FWT(f,(P+1)/2);for(ll i=0;i<n;i++)printf("%lld\n",(f[i]-f[0]+P)%P);return 0; }總結(jié)
以上是生活随笔為你收集整理的AT4996-[AGC034F]RNG and XOR【FWT,生成函数】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF605E-Intergalaxy T
- 下一篇: Imagination 联合 Venta