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

2024-02-15 15:32

本文主要是介绍AtCoder AGC034F RNG and XOR (概率期望、FWT),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

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

题解

无论多水的题我都不会啊.jpg
首先考虑一个图上随机游走的经典问题,无向图求从\(0\)号点出发随机游走到每个点的期望时间。做法是显然答案等于从每个点走到\(0\)号点的期望时间,然后列方程高斯消元。
设答案向量为\(\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}\)异或卷积的结果为\(\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}\)异或卷积的结果为常数数列\(\textbf{a}=\begin{bmatrix}2^n-1&-1&-1&...&-1\end{bmatrix}\).
现在已知\(\textbf{p}\)\(\textbf{a}\),要求出\(\textbf{x}\). FWT后的数列对应位置作除法即可。设\(\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})\), 设\(\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\)计算即可。
时间复杂度\(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;
}

这篇关于AtCoder AGC034F RNG and XOR (概率期望、FWT)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711782

相关文章

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

HDU 4035 Maze (树状dp + 概率)

OJ题目 : click here ~~~ 题目分析 :这篇文章已经说的很好很好了 , 直接借用 ,猛戳~~ int n;double k[10002] , e[10002];double A[10002] , B[10002] , C[10002];vector<int> List[10002];bool dfs(int u , int father){if(List[u].s

前端自查【知识点】(高概率)2024最新版

HTML 如何理解 HTML 语义化 ? 仅通过标签便能判断内容的类型,特别是区分标题、段落、图片和表格 增加代码可读性(让人更容易读懂)对SEO更加友好 (让搜索引擎更容易读懂) HTML有哪些内联元素和块状元素 ? 内联元素 宽度由内容决定 display :inline 若非替换元素,不能设置宽高 img,span , a 等 display :inline-bl

【校招面经】统计与概率基础 part2

十六、对偶问题 线性规划有一个有趣的特性,就是任何一个求极大的问题都有一个与其匹配的求极小的线性规划问题。 例;原问题为 MAX X=8*Z1+10*Z2+2*Z3 s.t. 2*Z1+1*Z2+3*Z3 〈=70 4*Z1+2*Z2+2*Z3 〈=80 3*Z1+ 1*Z3 〈=15 2*Z1+2*Z2 〈=50 Z1,Z2,Z3 〉=0 Z则其对偶问题为 MIN =70*Y

【HDU】 4089 Activation 概率DP

题目大意:Tomato要玩一个游戏,他需要排队,一开始这个队列共有N个人,而他在队列的第M个位置,每当有玩家尝试激活登陆游戏时, 会概率性触发四个事件。p1的概率注册失败,队列无变化。p2的概率连接失败,排在队首的人排到队尾。p3的概率成功,队首出队。p4的概率服务器 瘫痪,停止激活!这时候如果排在Tomato前面的人不足K个,那么他会很气愤。问 : Tomato排在第k位以内服务器瘫痪的概率。

人工智能之概率轮--5个灯泡的概率问题

题目:假设某电路由5个灯泡组装而成,连接方式如图所示。 假设5个灯泡在某时间范围内各自都能正常工作的概率都是p,且它们正常工作的事件是相互独立的,请问该电路在该时间范围内正常工作的概率是多少?   答: 第一种分析方法: 设2,3,1,4,5,分别为A,B,C,D,E。 那么有: P(A)=P(B)=P(C)=P(D)=P(E)=P 元件C是关键, 如果C正常工作,那么就会有