日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AT4996-[AGC034F]RNG and XOR【FWT,生成函数】

發(fā)布時(shí)間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AT4996-[AGC034F]RNG and XOR【FWT,生成函数】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/AT4996


題目大意

給出一個(gè)0~2n?10\sim 2^n-102n?1下標(biāo)的數(shù)組ppppip_ipi?表示有pip_ipi?的權(quán)重概率選擇iii

開(kāi)始有一個(gè)x=0x=0x=0,每次選擇一個(gè)數(shù)字yyyx=xxoryx=x\ xor\ yx=x?xor?y

對(duì)于每個(gè)iii求期望多久后第一次變成iii

1≤n≤181\leq n\leq 181n18


解題思路

搞一個(gè)異或卷積的生成函數(shù),先搞出概率的函數(shù)PPP

然后設(shè)EEE表示答案的函數(shù),那么有
E×P+I=E+cE\times P+I=E+cE×P+I=E+c
ccc表示余項(xiàng),I(x)=∑i=1∞xiI(x)=\sum_{i=1}^{\infty}x^iI(x)=i=1?xi

先求出余項(xiàng)ccc來(lái),設(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)=1S(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就好了。

注意跑出來(lái)的E0≠0E_0\neq 0E0??=0,我們要把所有的答案減去E0E_0E0?

時(shí)間復(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,生成函数】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。