正题

题目链接:https://www.luogu.com.cn/problem/AT4996


题目大意

给出一个\(0\sim 2^n-1\)下标的数组\(p\),\(p_i\)表示有\(p_i\)的权重概率选择\(i\)。

开始有一个\(x=0\),每次选择一个数字\(y\)让\(x=x\ xor\ y\)

对于每个\(i\)求期望多久后第一次变成\(i\)。

\(1\leq n\leq 18\)


解题思路

搞一个异或卷积的生成函数,先搞出概率的函数\(P\)。

然后设\(E\)表示答案的函数,那么有

\[E\times P+I=E+c
\]

\(c\)表示余项,\(I(x)=\sum_{i=1}^{\infty}x^i\)

先求出余项\(c\)来,设\(S(A)\)表示生成函数\(A\)的所有系数和

\[S(E)\times S(P)+S(I)=S(E)+c
\]

\(S(P)=1\),\(S(I)=2^n\),那我们有\(c=S(I)=2^n\)

所以就有

\[E\times P+I=E+2^n
\]
\[E\times (P-1)=2^n-I
\]
\[FWT(E)=\frac{FWT(2^n-I)}{FWT(P-1)}
\]

然后跑\(FWT\)就好了。

注意跑出来的\(E_0\neq 0\),我们要把所有的答案减去\(E_0\)

时间复杂度\(O(2^nn)\)


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;
}

AT4996-[AGC034F]RNG and XOR【FWT,生成函数】的更多相关文章

  1. 【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】

    Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v ...

  2. @atcoder - AGC034F@ RNG and XOR

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个值域在 [0, 2^N) 的随机数生成器,给定参数 A[ ...

  3. [AGC034F]RNG and XOR

    题目   点这里看题目. 分析   第一步可以将\(A\)数组转化成概率\(P(j)\):每一步操作异或\(j\)的概率.   接着发现,\(x\)从\(0\)变成\(i\)的期望等于\(x\)从\( ...

  4. Atcoder Grand Contest 034 F - RNG and XOR(FWT)

    Atcoder 题面传送门 & 洛谷题面传送门 tsc 考试前 A 的题了,结果到现在才写这篇题解--为了 2mol 我已经一周没碰键盘了,现在 2mol 结束算是可以短暂的春天 短暂地卷一会 ...

  5. bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4589 n*m*m 做法 dp[i][j] 前i堆石子,异或和为j的方案数 第一重循环可以矩阵快速幂 ...

  6. [atAGC034F]RNG and XOR

    令$N=2^{n}$先将$\forall 0\le i<N,a_{i}$除以$\sum_{i=0}^{N-1}a_{i}$,即变为概率 令$f_{i}$表示$i$的答案(第一次变成$i$的期望步 ...

  7. GOOD BYE OI

    大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...

  8. FWT 学习笔记

    FWT学习笔记 好久以前写的,先粘上来 定义数组 \(n=2^k\) \(A=[a_0,a_1,a_2,a_3,...,a_{n-1}]\) 令\(A_0=[a_0,a_1,a_2,...,a_{\f ...

  9. 能轻松背板子的FWT(快速沃尔什变换)

    FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到 ...

随机推荐

  1. C++指向函数的指针数组

    可以定义一个指针,指向一个函数,还 可以定义一个指向函数的指针数组,每个元素都是一个指向函数的指针,不过,它们指向的函数的格式都是相同的. 代码如下 //指向函数的指针数组 #include<i ...

  2. [C#]c#中数据的同步加锁机制 的几种方法

    一,锁定机制最简单的做法就是使用锁定关键字Lock.Lock关键字英文中就是锁的意思,顾名思义就是为操作加上一把锁.它的语法如下: lock(lockObj){//加锁的代码段,一般是操作共同资源的代 ...

  3. Maven脑图

    转自:https://segmentfault.com/a/1190000017832792 参考:https://www.cnblogs.com/mzywucai/p/11053341.html

  4. web整合Spring

    Spring整合Web开发 时间:2017-2-2 02:17 --导入jar包1.导入Spring开发基本jar包    spring-beans-3.2.0.RELEASE.jar     spr ...

  5. JDK1.5新特性之注解

    时间:2017-1-2 20:14 --注解的概述    注释是给人看的,而注解是给程序(框架)看的.    在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解 ...

  6. 算法入门 - 链表的实现及应用(Java版本)

    之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...

  7. TCP模拟QQ聊天功能

    需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...

  8. opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)

    0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...

  9. Python3-sqlalchemy-orm 创建关联表带外键并插入数据

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  10. Python之requests模块-response

    response类故名思议,它包含了服务器对http请求的响应.每次调用requests去请求之后,均会返回一个response对象,通过调用该对象,可以查看具体的响应信息. 示例如下: import ...