【luogu AGC034F】RNG and XOR(FWT)

RNG and XOR

题目链接:luogu AGC034F

题目大意

给你一个长度为 2^n 的数组 A。
一开始有一个 0 数,然后每次你随机给它异或上 0~2^n-1 中的数,随机到 i 的概率跟 Ai+1 成正比。
然后对于 0~2^n-1 每个数问你第一次变成这个数的期望异或次数。

思路

考虑使用生成函数,fi 为答案。

f0=0
fi=1+j=02n1fijpj
F+f0=I+FP

I=i=02n1xi

f0
F=i=0fixi
S(F)=i=0fi
S(F)+f0=S(I)+S(F)S(P)
S(P)=1,S(I)=2n
f0=2n

F+2n=I+FP
F(P1)=2nI,F=2nIP1

但是有一个问题就是 [x0](P1) 它 FWT 之后会是 0
那就别管第 0 位,当他是 0 然后 IFWT。
那我们还有一个限制条件是 f0=0,那你 IFWT 之后 0 会赋值到的位置是所有,但你现在没有了,那你 f0 现在的值是 x,那你给所有位置的值都加上 x,就相当于处理了 0 位置的贡献了。

代码

#include<cstdio> #define ll long long #define mo 998244353 using namespace std; const int N = 1 << 18; int n; ll p[N], a[N], sum, I[N], f[N], inv2; ll ksm(ll x, ll y) { ll re = 1; while (y) { if (y & 1) re = re * x % mo; x = x * x % mo; y >>= 1; } return re; } void FWT(ll *f, int n, int op) { for (int mid = 1; mid < n; mid <<= 1) for (int R = (mid << 1), j = 0; j < n; j += R) for (int k = 0; k < mid; k++) { ll x = f[j | k], y = f[j | mid | k]; if (op == 1) { f[j | k] = (x + y) % mo; f[j | mid | k] = (x - y + mo) % mo; } else { f[j | k] = (x + y) * inv2 % mo; f[j | mid | k] = (x - y + mo) * inv2 % mo; } } } int main() { inv2 = (mo + 1) / 2; scanf("%d", &n); for (int i = 0; i < (1 << n); i++) scanf("%lld", &a[i]), (sum += a[i]) %= mo; sum = ksm(sum, mo - 2); for (int i = 0; i < (1 << n); i++) p[i] = a[i] * sum % mo; p[0] = (p[0] - 1 + mo) % mo; I[0] = (1 << n); for (int i = 0; i < (1 << n); i++) I[i] = (I[i] - 1 + mo) % mo; FWT(p, 1 << n, 1); FWT(I, 1 << n, 1); for (int i = 1; i < (1 << n); i++) f[i] = I[i] * ksm(p[i], mo - 2) % mo; FWT(f, 1 << n, -1); ll fix = f[0]; for (int i = 0; i < (1 << n); i++) f[i] = (f[i] - fix + mo) % mo; for (int i = 0; i < (1 << n); i++) printf("%lld\n", f[i]); return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/luogu_AGC034F.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示