题目链接

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)相关推荐

  1. 【luogu AGC034F】RNG and XOR(FWT)

    RNG and XOR 题目链接:luogu AGC034F 题目大意 给你一个长度为 2^n 的数组 A. 一开始有一个 0 0 0 数,然后每次你随机给它异或上 0~2^n-1 中的数,随机到 i ...

  2. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Station ...

  3. 多元统计分析-概率,期望,方差,正态分布

    概率,期望,方差 只有一个变量时 F(x<=a) = ∫-∞af(x)dx 当区间取负无穷到正无穷时积分为1 推广到多元之后: 同理,当区间取满整个空间时,积分为1 f被称为概率密度函数 边缘分 ...

  4. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    UOJ #214 合唱队形 (概率期望计数.DP.Min-Max容斥) 9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/ ...

  5. loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...

  6. [2020多校A层11.22]party(概率期望/近似)

    [2020多校A层11.22]party 非常巧妙的一个概率期望问题,其实运用的还是近似的思想 现在有n个物品,每次一个人有pi的概率选中这个物品,然后可以进行猜测,但是无论是否猜中都继续游戏,直到所 ...

  7. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  8. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  9. UVA11427概率期望+独立重复事件

    1 /*UVA11427*/ 2 /*概率期望: 3 独立重复事件A(p,n): 4 p:一件事情发生的概率为p 5 n:最多重复n次 6 要求:1.q=成功次数/实验次数>p 结束实验: 7 ...

最新文章

  1. 【iOS】通讯录分组方式展示数据
  2. 汇编 int 10h
  3. Java 多线程之单例设计模式
  4. stmmac 中断处理
  5. 微软开源可扩展存储引擎Extensible Storage Engine
  6. 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!
  7. 【C++】new A和new A()的区别详解
  8. git 删除tag_Git常用命令
  9. Maven学习总结(30)——Maven项目通用三级版本号说明
  10. 第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)
  11. python sorted list 元组 多列排序
  12. Uber 踉跄上市、Facebook 要被拆分?!| 一周热闻回顾
  13. 轻量级ORM框架 Bankinate
  14. LNMP一键安装包+Thinkphp搭建基于pathinfo模式的路由(可以去除url中的.php)
  15. crunch 生成密码用例
  16. 小技巧:更改链接参数 提高京东秒杀成功率
  17. H3C 无线WLAN侧AC+FIA配置
  18. PLC的加权平均值滤波
  19. python:实现计算电阻Calculate resistance(附完整源码)
  20. 如何创建编辑维基百科?

热门文章

  1. oracle的redo和undo,OracleUndoRedo通俗理解
  2. java冒泡排序找最大的值_(13)數組操作:遍歷、輸出最大值、冒泡排序、選擇排序,java已有的排序方法、折半查找...
  3. 踩内存是什么意思啊_Win10任务管理器中的quot;共享GPU内存quot;是什么意思?
  4. Collaborative Filter - Data Mining基础(ACM暑校)
  5. 新兴机器学习算法:在线学习
  6. [OS复习]进程管理4
  7. 由一个小库存软件想到的
  8. 一个基于xml的超级orm框架-世界是由懒人创造的。
  9. linux下gdb调试方法和技巧详解
  10. go语言游戏编程-Ebiten使用矩阵实现对图的缩放和移动