令$N=2^{n}$先将$\forall 0\le i<N,a_{i}$除以$\sum_{i=0}^{N-1}a_{i}$,即变为概率

令$f_{i}$表示$i$的答案(第一次变成$i$的期望步数),则
$$
\begin{cases}f_{0}=0\\f_{i}=\left(\sum_{j=0}^{N-1}a_{j}f_{i\oplus j}\right)+1&(1\le i<N)\end{cases}
$$
定义$\bigoplus$为异或卷积,令$A(x)$和$F(x)$分别为对应序列的生成函数,则
$$
A\bigoplus F=\sum_{i=0}^{N-1}\left(\sum_{j=0}^{N-1}a_{j}f_{i\oplus j}\right)x^{i}=F-\sum_{i=1}^{N-1}x^{i}+\sum_{i=0}^{N-1}a_{i}f_{i}
$$
另一方面,注意到$\sum_{i=0}^{N-1}a_{i}=\sum_{i=0}^{N-1}f_{i}=1$(显然概率和为1),那么
$$
\sum_{i=0}^{N-1}[x^{i}](A\bigoplus F)=\sum_{j=0}^{N-1}a_{j}\sum_{i=0}^{N-1}f_{i\oplus j}=1
$$
而$F-\sum_{i=1}^{N-1}x^{i}+\sum_{i=0}^{N-1}a_{i}f_{i}$与左式相同,系数和也为1,即有
$$
\sum_{i=0}^{N-1}f_{i}-(N-1)+\sum_{i=0}^{N-1}a_{i}f_{i}=1
$$
不难解得$\sum_{i=0}^{N-1}a_{i}f_{i}=N-1$,代回原式即$A\bigoplus F=F-\sum_{i=1}^{N-1}x^{i}+(N-1)$

构造$A'=A-1$(即将$a_{0}$减1后的生成函数),则
$$
A'\bigoplus F=A\bigoplus F-\sum_{i=0}^{N-1}f_{i}x^{i}=(N-1)-\sum_{i=1}^{N-1}x^{i}
$$
直接FWT即可,以下过程即FWT的推导,熟练FWT的可以跳至这里——

定义$FWT(A)_{i}=\sum_{j=0}^{N-1}(-1)^{cnt(i\and j)}A_{j}$(即通常FWT后的序列),则有
$$
FWT(A\bigoplus F)_{i}=\sum_{j=0}^{N-1}(-1)^{cnt(i\and j)}\sum_{k=0}^{N-1}A_{k-1}F_{j\oplus k}
$$
(其中$cnt(x)$表示$x$二进制下1的个数)

注意到$cnt(i\and j)\equiv cnt(i\and k)+cnt(i\and (j\oplus k))(mod\ 2)$,代入即
$$
FWT(A\bigoplus F)_{i}=\left(\sum_{k=0}^{N-1}(-1)^{cnt(i\and k)}A_{k}\right)\left(\sum_{j=0}^{N-1}(-1)^{cnt(i\and (j\oplus k))}F_{j\oplus k}\right)=FWT(A)_{i}FWT(F)_{i}
$$
反过来,当求出$FWT(A)_{i}$和$FWT(A\bigoplus F)_{i}$时,也有$FWT(F)_{i}=\frac{FWT(A\bigoplus F)_{i}}{FWT(A)_{i}}$

得到$FWT(F)_{i}$后,考虑$FWT(FWT(F))_{i}$,即
$$
FWT(FWT(F))_{i}=\sum_{j=0}^{N-1}(-1)^{cnt(i\and j)}\sum_{k=0}^{N-1}(-1)^{cnt(j\and k)}F_{k}=\sum_{k=0}^{N-1}F_{k}\sum_{j=0}^{N-1}(-1)^{cnt(j\and (i\oplus k))}
$$
考虑后者,对$i\oplus k$是否为0分类讨论:

1.当$i\oplus k$为0,也即$i=k$,不难得到此时的式子为$NF_{i}$

2.当$i\oplus k$不为0时,假设其二进制下第$x$位为1,则$j$和$j\oplus 2^{x}$时的值即相互抵消,结果为0

综上,即可得$F_{i}=\frac{FWT(FWT(F))_{i}}{N}$,即可从$FWT(F_{i})$得到$F_{i}$(即IFWT)

上述过程看似没有问题,但当$FWT(A)_{i}=0$时,无法确定$FWT(F)_{i}$

注意到此时必然有$FWT(A\bigoplus F)_{i}=0$,而$A\bigoplus F=(N-1)-\sum_{i=1}^{N-1}x^{i}$,直接代入式子,即
$$
FWT(A\bigoplus F)_{i}=\sum_{j=0}^{N-1}(-1)^{cnt(i\and j)}(A\bigoplus F)_{j}=(N-1)-\sum_{j=1}^{N-1}(-1)^{cnt(i\and j)}
$$
不难发现当$i\ne 0$时,$cnt(i\and j)$不可能全为偶数,因此结果不为0,同时$i=0$时结果为0

由此,$FWT(A)_{i}=0$的位置也仅有$i=0$,不妨先将其设置为0,也可以得到一个$F'$,此时$[x^{0}]F'$与0的差值即是$-\frac{FWT(F)_{0}}{N}$,并以此修正(或再做一次)即可

总复杂度为$o(nN)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define M (1<<18)
4 #define mod 998244353
5 #define ll long long
6 int N,n,s,a[M],b[M],f[M];
7 int qpow(int n,int m){
8 int s=n,ans=1;
9 while (m){
10 if (m&1)ans=(ll)ans*s%mod;
11 s=(ll)s*s%mod;
12 m>>=1;
13 }
14 return ans;
15 }
16 void fwt(int *a,int p){
17 for(int i=0;i<n;i++)
18 for(int j=0;j<N;j++)
19 if (j&(1<<i)){
20 int x=a[j^(1<<i)],y=a[j];
21 a[j^(1<<i)]=(x+y)%mod;
22 a[j]=(x+mod-y)%mod;
23 }
24 if (p){
25 int s=qpow(N,mod-2);
26 for(int i=0;i<N;i++)a[i]=(ll)a[i]*s%mod;
27 }
28 }
29 int main(){
30 scanf("%d",&n);
31 N=(1<<n);
32 for(int i=0;i<N;i++){
33 scanf("%d",&a[i]);
34 s+=a[i];
35 }
36 s=qpow(s,mod-2);
37 for(int i=0;i<N;i++)a[i]=(ll)a[i]*s%mod;
38 a[0]=(a[0]+mod-1)%mod;
39 b[0]=N-1;
40 for(int i=1;i<N;i++)b[i]=mod-1;
41 fwt(a,0);
42 fwt(b,0);
43 for(int i=0;i<N;i++)b[i]=(ll)b[i]*qpow(a[i],mod-2)%mod;
44 memcpy(f,b,sizeof(f));
45 fwt(b,1);
46 f[0]=mod-(ll)N*b[0]%mod;
47 fwt(f,1);
48 for(int i=0;i<N;i++)printf("%d\n",f[i]);
49 }

[atAGC034F]RNG and XOR的更多相关文章

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

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

  2. AT4996-[AGC034F]RNG and XOR【FWT,生成函数】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4996 题目大意 给出一个\(0\sim 2^n-1\)下标的数组\(p\),\(p_i\)表示有\(p_i\) ...

  3. [AGC034F]RNG and XOR

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

  4. @atcoder - AGC034F@ RNG and XOR

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

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

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

  6. GOOD BYE OI

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

  7. 【AtCoder】AGC034

    AGC034 刷了那么久AtCoder我发现自己还是只会ABCE(手动再见 A - Kenken Race 大意是一个横列,每个点可以跳一步或者跳两步,每个格子是空地或者石头,要求每一步不能走到石头或 ...

  8. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  9. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. 安全通信协议SSH应用与分析

    一.实验简介: 本次实验属于安全协议应用与分析系列 二 实验环境: Windows server 2003 server windows xp 做client 三.实验目的 通过该实验了解SSH服务器 ...

  2. Bert文本分类实践(二):魔改Bert,融合TextCNN的新思路

    写在前面 ​ 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,博主水平有限,只能将平时用到的方法和trick在此做个记录和分享 ...

  3. TypeScript 枚举指南

    枚举是受 TypeScript 支持的数据类型.枚举允许您定义一组命名常量.使用它们可以更轻松地记录意图或创建一组不同的案例.枚举大多数用于面向对象的编程语言(如 Java 和 C#)中,现在也可以 ...

  4. 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

    今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...

  5. 运用shapefile.js解析Shp文件

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  6. 好奇!仅 13kB 大小的游戏,源码长啥样?

    这个马赛克风格的表情正好 13Kb,有人竟然能用一个表情大小的空间,制作个游戏出来.我就不信这么点的地儿,能写出个花来?游戏能好玩吗?因为这些游戏点开就能玩,我抱着试一试的心态把玩了一会. 事实证明是 ...

  7. 无网环境安装docker之--rpm

    总体思路:找一台可以联网的linux,下载docker的RPM依赖包而不进行安装(yum localinstall),将所有依赖的rpm环境打包好,再在无网环境中解压逐一安装(rpm:  --forc ...

  8. (翻译)领域驱动设计实现-Implementing Domain Driven Design

    简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...

  9. 脚本注入3(blind)

    布尔盲注适用于任何情况回显都不变的情况. (由此,可以看出,回显啥的其实都不重要,最重要的是判断注入点.只要找到注入点了,其他的都是浮云.) 在操作上,时间盲注还稍微简单一点:它不需要像布尔盲注那样, ...

  10. 第二次Alpha Scrum Meeting

    本次会议为Alpha阶段第二次Scrum Meeting会议 会议概要 会议时间:2021年4月24日 会议地点:线上会议 会议时长:30min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...