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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AtCoder AGC034F RNG and XOR (概率期望、FWT)

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder AGC034F RNG and XOR (概率期望、FWT) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接

https://atcoder.jp/contests/agc034/tasks/agc034_f

題解

無論多水的題我都不會啊.jpg
首先考慮一個圖上隨機游走的經(jīng)典問題,無向圖求從\(0\)號點出發(fā)隨機游走到每個點的期望時間。做法是顯然答案等于從每個點走到\(0\)號點的期望時間,然后列方程高斯消元。
設(shè)答案向量為\(\textbf{x}\), 則有\(x_i=\sum_{j\ \text{xor}\ k=i}p_kx_j+1(1\le i\lt 2^n)\)\(x_0=0\). 即\(\textbf{x}\)\(\textbf{p}\)異或卷積的結(jié)果為\(\begin{bmatrix}x_0' & x_1-1 & x_2-1 & ... & x_{2^n-1}-1\end{bmatrix}\). 觀察到\(\sum^{2^n-1}_{i=0}p_i=1\),故\(\sum^{2^n-1}_{i=0}x_i=x_0'+\sum^{2^n-1}_{i=1}(x_i-1)\), 即\(x_0'=x_0+2^n-1\). 再用\(p_0-1\)替換\(p_0\)\(\textbf{x}\)\(\textbf{p}\)異或卷積的結(jié)果為常數(shù)數(shù)列\(\textbf{a}=\begin{bmatrix}2^n-1&-1&-1&...&-1\end{bmatrix}\).
現(xiàn)在已知\(\textbf{p}\)\(\textbf{a}\),要求出\(\textbf{x}\). FWT后的數(shù)列對應(yīng)位置作除法即可。設(shè)\(\text{FWT}(\textbf{p})=\textbf{P}\) (其余字母同理), 則\(\forall 1\le i\le 2^n-1, P_i\lt \sum^{2^n-1}_{i=0}p_i=P_0=0\), 也即\(\textbf{P}\)序列有且僅有\(P_0\)\(0\). \(P_0\)\(A_0\)皆為\(0\), 我們無法還原出\(X_0\).
\(\textbf{x}=\text{IFWT}(\textbf{X})\), 設(shè)\(\textbf{X'}=\begin{bmatrix}0&X_1&X_2&...&X_{2^n-1}\end{bmatrix}\), 則\(\forall 0\le i\le 2^n-1, x'_i=x_i-\frac{X_0}{2^n}=x_i-(x_0-x'_0)=x_i+x'_0\), 故用\(x_i=x'_i-x'_0\)計算即可。
時間復(fù)雜度\(O(2^nn)\).

代碼

#include<bits/stdc++.h> #define llong long long using namespace std;inline int read() {int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f; }const int N = 18; const int P = 998244353; const llong INV2 = 499122177ll; llong p[(1<<N)+3]; llong a[(1<<N)+3],b[(1<<N)+3]; int n,sum;llong quickpow(llong x,llong y) {llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret; } llong mulinv(llong x) {return quickpow(x,P-2);}void fwt(int dgr,int coe,llong poly[],llong ret[]) {memcpy(ret,poly,sizeof(llong)*(1<<dgr));for(int i=0; i<dgr; i++){for(int j=0; j<(1<<dgr); j+=(1<<i+1)){for(int k=0; k<(1<<i); k++){llong x = poly[k+j],y = poly[k+(1<<i)+j];poly[k+j] = x+y>=P?x+y-P:x+y; poly[k+(1<<i)+j] = x-y<0?x-y+P:x-y;}}}if(coe==-1) {llong tmp = mulinv(1<<dgr); for(int i=0; i<(1<<dgr); i++) ret[i] = ret[i]*tmp%P;} }int main() {scanf("%d",&n); for(int i=0; i<(1<<n); i++) {scanf("%lld",&p[i]); sum += p[i];} sum = mulinv(sum);for(int i=0; i<(1<<n); i++) p[i] = p[i]*sum%P; p[0] = (p[0]-1+P)%P;a[0] = (1<<n)-1; for(int i=1; i<(1<<n); i++) a[i] = P-1;fwt(n,1,a,a); fwt(n,1,p,p);b[0] = 0ll; for(int i=1; i<(1<<n); i++) b[i] = a[i]*mulinv(p[i])%P;fwt(n,-1,b,b);llong tmp = b[0]; for(int i=0; i<(1<<n); i++) b[i] = (b[i]-tmp+P)%P;for(int i=0; i<(1<<n); i++) printf("%lld\n",b[i]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的AtCoder AGC034F RNG and XOR (概率期望、FWT)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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