令$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. 程序员微机课系列—我的nodejs多版本管理方法

    nodejs的多版本配置对于我来说一直都是一个较为头疼的事情.本人的开发工作会涉及electron以及前端,对于工作中使用的npm包(点名node-sqlite3和node-sass)在某些情况下,会 ...

  2. windows中抓包命令,以及保存为多个文件的方法

    本文主要介绍windows中抓包命令,以及保存为多个文件的方法 说一说保存为多个文件存储数据包这个问题的由来,一般如果长时间抓包,有可能需要等上几个小时,因为这个时候抓包的内容都是存放在内存中的,几个 ...

  3. xshell连接VMware中的Linux

    [前言]最近想压测一下ITOO的考试系统,所以想在自己电脑上安装一下linux,然后安装一下jmeter进行压测一下. 不过为什么要连接xshell呢,因为在虚拟机上总是会和主机切换鼠标,而且也不能粘 ...

  4. Go语言核心36讲(Go语言基础知识五)--学习笔记

    05 | 程序实体的那些事儿(中) 在前文中,我解释过代码块的含义.Go 语言的代码块是一层套一层的,就像大圆套小圆. 一个代码块可以有若干个子代码块:但对于每个代码块,最多只会有一个直接包含它的代码 ...

  5. Java中的基本类型和包装类

    Java中基本数据类型与包装类型有   基本类型     包装器类型   boolean Boolean char Character int Integer byte Byte short Shor ...

  6. 2020.12.20-Codeforces Round #105补题

    B - Escape The princess is going to escape the dragon's cave, and she needs to plan it carefully. Th ...

  7. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  8. Hive架构及搭建方式

    目录 前言 hive的基础知识 基本架构 metastore 内嵌服务和数据库 内嵌服务 服务和数据库单独部署 hcatalog 客户端 客户端的本地模式 beeline beeline的自动模式 j ...

  9. Apache Zookeeper Java客户端Curator使用及权限模式详解

    这篇文章是让大家了解Zookeeper基于Java客户端Curator的基本操作,以及如何使用Zookeeper解决实际问题. Zookeeper基于Java访问 针对zookeeper,比较常用的J ...

  10. UI自动化测试之Airtest

    官方文档: https://airtest.doc.io.netease.com/ 本文我们讲解下Airtest的使用,主要学习目标有以下几点: (1)认识Airtest (2)了解Airtest能做 ...