Description

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

现在有一个初始为0的数X,每一轮随机生成一个数v,将X变成X xor v

求X变成0~2^N-1的期望轮数

答案对998244353取模

N<=18,Ai<=1000

Solution

不妨反过来做,f[i]为i到0的期望轮数,显然等价

易得i>0,

\[f[i]=1+\sum f[i\ xor\ j]p[j]
\]

1移到左边来

\[f[i]-1=\sum f[i\ xor\ j]p[j]
\]

写成集合幂级数形式就是

\[(f[0],f[1],f[2],...,f[2^N-1])\bigoplus(p[0],p[1],p[2],...,p[2^N-1])=(?,f[1]-1,f[2]-1,...,f[2^N-1])
\]

?是因为f[0]不满足转移式

但我们发现\(\sum p=1\),也就是说卷积过后总和不变

因此\(? = f[0]+2^N-1\)

把p[0]-1,后面的f就全部消掉

我们做一个逆卷积即可。

具体来说,把等号右边FWT,乘上中间的FWT再每项逆元的结果,再IFWT回去。

不行。

我们发现中间集合幂级数的FWT后2^N-1 +(-1)+(-1)+…+(-1)这一项是0(容易证明只有这一项是0),对应的右边也是0,我们无法得到左边这一项的值。

但我们忽略了一个信息,f[0]=0

不妨先假定左边这一项就是0,IFWT回去以后看看f[0]差了多少,那就是这一项少贡献了多少,推回去就行了。

时间复杂度O(2^N*N)

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define L 19
#define M 262144
const int mo=998244353;
typedef long long LL;
using namespace std;
int n,m;
int a[M+1],b[M+1];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
const LL ny2=499122177;
void FWT(int *a,bool pd)
{
for(int h=1;h<m;h<<=1)
for(int j=0;j<M;j+=h*2)
fo(i,0,h-1)
{
int v=a[i+j+h];
a[i+j+h]=(a[i+j]-v+mo)%mo,a[i+j]=(a[i+j]+v)%mo;
if(pd) a[i+j]=(LL)a[i+j]*ny2%mo,a[i+j+h]=(LL)a[i+j+h]*ny2%mo;
}
}
LL pr[M];
int main()
{
cin>>n;
m=1<<n;
LL sum=0;
fo(i,0,m-1) scanf("%lld",&pr[i]),sum=(sum+pr[i])%mo;
sum=ksm(sum,mo-2);
a[0]=m-1;
fo(i,1,m-1) a[i]=mo-1;
fo(i,0,m-1) b[i]=pr[i]*sum%mo;
b[0]=(b[0]-1+mo)%mo;
FWT(a,0),FWT(b,0);
int wz=0;
fo(i,0,m-1)
{
if(b[i]!=0) a[i]=(LL)a[i]*ksm(b[i],mo-2)%mo;
else a[i]=0,wz=i;
}
FWT(a,1);
LL wp=(LL)(mo-a[0])*m%mo;
FWT(a,0);
a[wz]=wp;
FWT(a,1);
fo(i,0,m-1) printf("%d\n",a[i]);
}

【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】的更多相关文章

  1. @atcoder - AGC034F@ RNG and XOR

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

  2. [AGC034F]RNG and XOR

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

  3. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  4. Codeforces 1408I - Bitwise Magic(找性质+集合幂级数)

    Codeforces 题面传送门 & 洛谷题面传送门 Yet another immortal D1+D2 I %%%%%% 首先直接统计肯定是非常不容易的,不过注意到这个 \(k\) 非常小 ...

  5. bzoj 4036 集合幂级数

    集合幂级数其实就是一种集合到数的映射,并且我们针对集合的一些操作(or  xor and specil or )为这种映射定义运算.其中一些东西可以通过某些手段将其复杂度降低. orz vfk /** ...

  6. dp杂题(根据个人进度选更)

    ----19.7.30 今天又开了一个新专题,dp杂题,我依旧按照之前一样,这一个专题更在一起,根据个人进度选更题目; dp就是动态规划,本人认为,动态规划的核心就是dp状态的设立以及dp转移方程的推 ...

  7. Codeforces 杂题集 2.0

      记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序   1326D2 - Prefix-Suffix Palindrome (Hard version) ...

  8. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  9. 洛谷 P6570 - [NOI Online #3 提高组] 优秀子序列(集合幂级数+多项式)

    洛谷题面传送门 首先 \(3^n\) 的做法就不多说了,相信对于会状压 dp+会枚举子集的同学来说不算困难(暴论),因此这篇博客将着重讲解 \(2^nn^2\) 的做法. 首先如果我们把每个 \(a_ ...

随机推荐

  1. mysql jdbc url

    地址为jdbc:mysql://localhost:3306/mymiaosha?characterEncoding=utf-8时访问时可能会出现下图提示 地址改为jdbc:mysql://local ...

  2. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

  3. thinkphp3.2.3 自定义路由实践

    使用了很久的tp3,却没发现还有这么可玩性的功能. 官方文档:要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用( ...

  4. 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制

    1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了过 ...

  5. 【Activiti】为每一个流程绑定相应的业务对象的2种方法

    方式1: 在保存每一个流程实例时,设置多个流程变量,通过多个流程变量的组合来过滤筛选符合该组合条件的流程实例,以后在需要查询对应业务对象所对应的流程实例时,只需查询包含该流程变量的值的流程实例即可. ...

  6. docker 环境安装

    centos7下安装docker.docker-compose 参考文档:https://docs.docker.com/ 一.安装docker 1).Docker 要求 CentOS 系统的内核版本 ...

  7. iOS响应链和传递机制

    iOS中加载的时候会先执行main函数 int main(int argc, charchar * argv[]) { @autoreleasepool { return UIApplicationM ...

  8. charles 安装使用教程及弱网设置

    1.安装jdk环境 2.下载charles 3.打开直接使用 4.手机端安装相关证书 5.手机端网络设置代理 6.分析查看数据 点击sequane中的值查看app中的数据返回与请求值.   charl ...

  9. jumpserver开源堡垒机部署安装

    0x01.前言 Jumpserver 是全球首款完全开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 的专业运维审计系统. Jumpserver 使用 Python / Djang ...

  10. 64位Win7安装Oracle12C临时位置权限错误解决方案

    今天装备安装Oracle12C体验一下,结果遇到问题:请确保当前用户具有访问临时位置所需的权限,无法继续安装,上网查了一下,解决方案如下:  第一步:  控制面板>所有控制面板项>管理工具 ...