AT4996 [AGC034F] RNG and XOR【異或,期望】

AT4996 [AGC034F] RNG and XOR

在這裏插入圖片描述
eie_i 表示從 0 走到 ii 的期望次數,顯然等於 ii 走到 0 的期望次數。
ei={0,i=01+j=02n1eijpj,i0e_i=\begin{cases}0,&i=0\\1+\sum_{j=0}^{2^n-1}e_{i\oplus j}*p_j,&i\neq 0\end{cases}

E,PE,P 分別爲 ei,pie_i,p_i 的集合冪級數,用異或卷積定義乘法,則有:
EP+I=E+cE*P+I=E+c
其中 cc 爲一個常數,用於修正 e0e_0

得到 FWT(E)FWT(P)+FWT(I)=FWT(E)+FWT(c)FWT(E)*FWT(P)+FWT(I)=FWT(E)+FWT(c)
ii 處的關係式爲:FWT(E)i(FWT(P)i1)=FWT(c)iFWT(I)iFWT(E)_i*(FWT(P)_i-1)=FWT(c)_i-FWT(I)_i
其中 FWT(I)=2nFWT(I)=2^nFWT(c)=i=02n1cxiFWT(c)=\sum_{i=0}^{2^n-1}cx^i
i=0i=0 時,FWT(P)0=pi=1FWT(P)_0=\sum p_i=1,所以 c=FWT(I)0=2nc=FWT(I)_0=2^n

對於 i>1i>1FWT(P)i<S(P)=1FWT(P)_i<S(P)=1,所以 FWT(E)i=2nFWT(P)i1FWT(E)_i=\frac {2^n}{FWT(P)_i-1}

FWT(E)0FWT(E)_0 利用 e0=0=12nj=02n1FWT(E)je_0=0=\frac 1{2^n}\sum_{j=0}^{2^n-1}FWT(E)_j 求解。

實際上可以假設 FWT(E)0=0FWT(E)_0=0 求出一個答案 EE',然後實際上 Ei=Ei+12nFWT(E)0E_i=E_i'+\frac 1{2^n}FWT(E)_0,所以 12nFWT(E)0=0E0\frac 1{2^n}FWT(E)_0=0-E_0'

求出 FWT(E)FWT(E) 後再變換回來就可以了。

雙倍經驗:ZJOI2019開關,題解裏面最後 FWT(G)T=iTpiiTpiFWT(G)_T=\sum_{i\notin T}p_i-\sum_{i\in T}p_i 是因爲概率只在單點處有值。

Code:

#include<bits/stdc++.h>
#define maxn 300005
using namespace std;
const int mod = 998244353;
int n,N,p[maxn],E[maxn];
int Pow(int a,int b){int s=1;for(;b;b>>=1,a=1ll*a*a%mod) b&1&&(s=1ll*s*a%mod); return s;}
int upd(int x){return x+(x>>31&mod);}
void FWT(int *a,int len,int flg){
	for(int i=2,l=1,v;i<=len;l=i,i<<=1)
		for(int j=0;j<len;j+=i)
			for(int k=j;k<j+l;k++)
				v=a[k],a[k]=upd(v+a[k+l]-mod),a[k+l]=upd(v-a[k+l]);
	if(flg^1) for(int i=0,Inv=Pow(len,mod-2);i<len;i++) a[i]=1ll*a[i]*Inv%mod;
}
int main()
{
	scanf("%d",&n),N=1<<n; int s=0;
	for(int i=0;i<N;i++) scanf("%d",&p[i]),s=upd(s+p[i]-mod);
	s=Pow(s,mod-2);
	for(int i=0;i<N;i++) p[i]=1ll*p[i]*s%mod;
	FWT(p,N,1);
	for(int i=1;i<N;i++) E[i]=1ll*N*Pow(upd(p[i]-1),mod-2)%mod;
	FWT(E,N,-1);
	int x=mod-E[0];
	for(int i=0;i<N;i++) printf("%d\n",upd(E[i]+x-mod));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章