Atcoder 题面传送门 & 洛谷题面传送门

tsc 考试前 A 的题了,结果到现在才写这篇题解……为了 2mol 我已经一周没碰键盘了,现在 2mol 结束算是可以短暂的春天 短暂地卷一会儿 OI 了((

u1s1 写这篇题解的时候我连题都快忘了。。。

首先设 \(b_i=\dfrac{A_i}{\sum\limits_{j=0}^{2^n-1}A_j}\),其次碰到这种期望类的题目我们考虑套路地设 \(p_i\) 表示异或得到 \(i\) 的概率,那么有 \(p_i=\sum\limits_{j=0}^{2^n-1}p_jb_{i\oplus j}+1\),\(p_0=0\)。这个状态定义是存在后效性的,而高斯消元 \(8^n\) 又显然会超时,因此考虑从这个转移式本身入手进行优化。注意到这个转移式长得有点像异或卷积,因此考虑用异或卷积的形式将这个式子写出来,即 \(p=p\times b+I\),其中 \(\forall i,I_i=1\),异常好理解。

不过事实上这个式子是有个 bug 的,\(p_0=0\),而将 \(p_0\) 带到右边去就不一定等于 \(0\) 了,也就是说左边实际上要加上一个常数 \(X\),即 \(p+X=p\times b+I(X\in\mathbb{R})\)(事实上很多生成函数的题也需要注意常数项的问题,比如说斐波那契数列,这里就不再赘述了)。怎么求这个 \(X\) 的值呢?这里又是一个套路,将左边每一项都变成它的系数和,相当于多项式里的令 \(x=1\),那么可以得到 \((\sum\limits_{i=0}^{2^n-1}p_i)+X=(\sum\limits_{i=0}^{2^n-1}p_i)\times (\sum\limits_{i=0}^{2^n-1}b_i)+(\sum\limits_{i=0}^{2^n-1}I_i)\),而显然 \(\sum\limits_{i=0}^{2^n-1}b_i=1\),故 \(X=\sum\limits_{i=0}^{2^n-1}I_i=2^n\),因此 \(p+2^n=p\times b+I\),简单移个项可得 \(2^n-I=p\times(b-1)\),故 \(p=\dfrac{2^n-I}{b-1}\),把上下两个幂级数 FWTxor 一下相除再 FWTxor 回去即可得到 \(p\)。

还有一个小问题,就是在求逆元的时候有可能会出现分母为 \(0\) 的情况。事实上,由于 \(A_i\le 1000\),因此从所有 \(b_i\) 中任意选出一些出来它们的分子分母都 \(<998244353\),记 \(F=\text{FWT}(b-1)\),那么必然有 \(F_i\le 0(i\ne 0)\),而 \(F_0=-1+\sum\limits_{i=0}^{2^n-1}b_i=0\),因此出错的只可能是 \(F_0\)。不过这个问题很好解决,我们已知 \(p_0=0\),而显然对于一个幂级数 \(F\) FWTxor 后得到的幂级数 \(G\),常数项上加上一个常数 \(C\) 对于 \(F\) 的作用效果就是每一项都加上 \(C\),因此我们只需输出 \(p_i-p_0\) 即可。

const int MAXP=1<<18;
const int MOD=998244353;
int qpow(int x,int e=MOD-2){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int n,a[MAXP+5],b[MAXP+5],c[MAXP+5];
void FWTxor(int *a,int len,int type){
for(int i=2;i<=len;i<<=1)
for(int j=0;j<len;j+=i)
for(int k=0;k<(i>>1);k++){
int X=a[j+k],Y=a[(i>>1)+j+k];
a[j+k]=1ll*(X+Y)*type%MOD;
a[(i>>1)+j+k]=1ll*(X-Y+MOD)*type%MOD;
}
}
int main(){
scanf("%d",&n);n=1<<n;int sum=0;
for(int i=0;i<n;i++) scanf("%d",&a[i]),sum+=a[i];sum=qpow(sum);
for(int i=0;i<n;i++) a[i]=1ll*a[i]*sum%MOD;a[0]=(a[0]-1+MOD)%MOD;
for(int i=0;i<n;i++) b[i]=MOD-1;b[0]=(b[0]+n)%MOD;
FWTxor(a,n,1);FWTxor(b,n,1);
for(int i=0;i<n;i++) c[i]=1ll*b[i]*qpow(a[i])%MOD;
FWTxor(c,n,MOD+1>>1);
for(int i=0;i<n;i++) printf("%d\n",(c[i]-c[0]+MOD)%MOD);
return 0;
}

Atcoder Grand Contest 034 F - RNG and XOR(FWT)的更多相关文章

  1. Atcoder Grand Contest 030 F - Permutation and Minimum(DP)

    洛谷题面传送门 & Atcoder 题面传送门 12 天以前做的题了,到现在才补/yun 做了一晚上+一早上终于 AC 了,写篇题解纪念一下 首先考虑如果全是 \(-1\)​ 怎么处理.由于我 ...

  2. Atcoder Grand Contest 003 F - Fraction of Fractal(矩阵乘法)

    Atcoder 题面传送门 & 洛谷题面传送门 Yet another AGC F,然鹅这次就没能自己想出来了-- 首先需注意到题目中有一个条件叫做"黑格子组成的连通块是四联通的&q ...

  3. Atcoder Grand Contest 016 F - Games on DAG(状压 dp)

    洛谷题面传送门 & Atcoder 题面传送门 如何看待 tzc 补他一个月前做的题目的题解 首先根据 SG 定理先手必输当且仅当 \(\text{SG}(1)=\text{SG}(2)\). ...

  4. Atcoder Grand Contest 010 C - Cleaning 树贪心(伪)

    C - Cleaning 题目连接: http://agc010.contest.atcoder.jp/tasks/agc010_c Description There is a tree with ...

  5. Atcoder Grand Contest 001 D - Arrays and Palindrome(构造)

    Atcoder 题面传送门 洛谷题面传送门 又是道思维题,又是道把我搞自闭的题. 首先考虑对于固定的 \(a_1,a_2,\dots,a_n;b_1,b_2,\dots,b_m\) 怎样判定是否合法, ...

  6. Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)

    题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...

  7. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  8. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  9. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

随机推荐

  1. javascript运算符和表达式

    1.表达式的概念 由运算符连接操作组成的式子,不管式子有多长,最终都是一个值. 2.算术运算符 加+ 减- 乘* 除/ 取模% 负数- 自增++ 自减-- 3.比较运算符 等于==  严格等于=== ...

  2. Google Object detection配置与使用

    Google Object detection 前言: 本文记录了使用Google发布的Object detection(July 1st, 2019)接口,完成了对标注目标的检测.参考了很多博文,在 ...

  3. 易维巡APP技术支持

    亲爱的用户 如果您在使用我们的产品时遇到任何问题,请随时与我们联系,我们将全力全意为您解决! 请发邮件与我们联系,我们将24小时为您服务! 电话:18251927768 邮箱地址:xshm999@16 ...

  4. Scrum Meeting 13

    第13次例会报告 日期:2021年06月05日 会议主要内容概述: 团队成员均明确了下一步的目标,进度突飞猛进辣 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下 ...

  5. AFO记

    希望永远也不要动笔写这个. 发以自勉

  6. Hash算法:双重散列

    双重散列是线性开型寻址散列(开放寻址法)中的冲突解决技术.双重散列使用在发生冲突时将第二个散列函数应用于键的想法. 此算法使用: (hash1(key) + i * hash2(key)) % TAB ...

  7. (继承)Program2.1

    覆盖和重写的意思是一样?结果是一样的 例如: 1 class Parent: # 定义父类 2 def myMethod(self): 3 print('调用父类方法') 4 5 6 class Ch ...

  8. 01_WPF概述

    目录 Windows 图形演化 高级API 分辨率无关性 WPF体系结构 我的微信公众号 Windows 图形演化 在 WPF 之前,windows 开发一直使用本质上相同的显示技术.每个传统 win ...

  9. Redis去重方法

    目录 1.基于 set 2.基于 bit 3.基于 HyperLogLog 4. 基于bloomfilter 这篇文章主要介绍了Redis实现唯一计数的3种方法分享,本文讲解了基于SET.基于 bit ...

  10. SimpleNVR流媒体服务在多分屏直播实时阅览时所遇到问题的解决

    视频有一个流的概念,称为流媒体.当大量的客户端或WEB访问监控摄像机的时候,大多数的录像机无法承受那么大的网络压力,这时候SimpleNVR流媒体服务器的优势就显示出来了.其能将客户端的访问压力转到服 ...