首页 > 其他分享 >AGC034F RNG and XOR(FWT,*)

AGC034F RNG and XOR(FWT,*)

时间:2022-11-08 18:56:09浏览次数:70  
标签:XOR sub int AGC034F long ++ FWT mod

AGC034F RNG and XOR

\(x\) 初始为 \(0\),每次会有 \(p_{i(/2 ^ N)}\) 的概率变成 \(x \oplus i\),问对于所有 \(0 \le k < 2 ^ N\),\(x\) 第一次变成 \(k\) 的期望次数。\(N \le 18\)。

CODE

设 \(f_i\) 表示 \(i\) 的期望次数。

\[\forall i \neq 0 : f_i = \sum_{j = 0} ^ {2 ^ N - 1} f_{i \oplus j} p_j \]

FWT 转集合幂级数:

\[F = FP + I - c \]

代入多项式的和可得:\(c = 2 ^ N\)。

于是 \(F = \frac{2 ^ N - I}{P - 1}\)。\(f_0\) 还是会被算错,所以最后所有 \(f_i \leftarrow f_i - f_0\)。

集合幂级数乘法逆就是先 FWT 然后求逆点值。

#include <bits/stdc++.h>
using namespace std;

constexpr int mod = 998244353;

void sub(int& x) {
	if (x >= mod) x -= mod;
}

int power(int a, int x = mod - 2) {
	int res = 1;
	while (x) {
		if (x & 1) res = (long long)res * a % mod;
		x >>= 1;
		a = (long long)a * a % mod;
	}
	return res;
}

void fwt(vector<int>& a) {
	for (unsigned int k = 1; k < a.size(); k *= 2) for (unsigned int i = 0; i < a.size(); i += k * 2) for (unsigned int j = 0; j < k; ++j) {
		int x = a[i | j], y = a[i | k | j];
		sub(a[i | j] = x + y);
		sub(a[i | k | j] = x - y + mod);
	}
}

void ifwt(vector<int>& a) {
	fwt(a);
	int inv = power(a.size());
	for (unsigned int i = 0; i < a.size(); ++i) a[i] = (long long)a[i] * inv % mod;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N;
	cin >> N;
	N = 1 << N;
	vector<int> p(N);
	for (int i = 0; i < N; ++i) cin >> p[i];
	int invp = power(accumulate(p.begin(), p.end(), 0ll) % mod);
	for (int i = 0; i < N; ++i) p[i] = (long long)p[i] * invp % mod;
	sub(p[0] += mod - 1);
	vector<int> a(N, mod - 1);
	sub(a[0] += N);
	fwt(a);
	fwt(p);
	for (int i = 0; i < N; ++i) a[i] = (long long)a[i] * power(p[i]) % mod;
	ifwt(a);
	for (int i = N - 1; i >= 0; --i) sub(a[i] += mod - a[0]);
	for (int i = 0; i < N; ++i) cout << a[i] << '\n';
}
/*
	3.00s 1.00GB
*/

标签:XOR,sub,int,AGC034F,long,++,FWT,mod
From: https://www.cnblogs.com/Pizza1123/p/16870805.html

相关文章

  • CF1572B. Xor of 3
    题意给出一个\(01\)序列,一次操作可以选择连续的三个数,把它们都变成三个数的异或和。问能否在\(n\)次以内全变成\(0\),输出方案题解仔细研究发现,无论如何三个数的异......
  • LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
    \[C_k=\sum_{i|j=k}A_iB_j\]这样的或卷积可以做一次\(\text{FWT}\),把数组变为\(a_i=\sum_{j\subseteqi}A_i\),也就是子集和的形式,然后就可以对应位相乘了变回去的......
  • Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round) F M
    A-E都还是比较简单的。首先,容易想到的,异或上\(2^k\),相当于以\(2^{k+1}\)的长度分块,然后每一块对半切,然后交换左右部分。我的想法是由于这个交换的性质,也许我们可以尝......
  • CF1743E FTL(哈希,DP)——关于 xorshift 的哈希冲突
    CF1743EFTL有两把laser枪,一把伤害\(p_0\)两发间隔时间至少\(t_0\),另一把\(p_1,t_1\)。打敌方太空船,血量\(N\)防御值\(s\),如果某个时刻你对太空船打出\(P\)的......
  • 位运算卷积(FWT)
    本文大量参考了:command_block的博客:位运算卷积(FWT)&集合幂级数FWT概论定义位运算卷积:\(C[k]=\sum\limits_{i\oplusj=k}A[i]B[j]\),记作\(C=A*B\),其中$\oplus$......
  • 【XSY3313】异或和(xorsum)(结论)
    先上一个结论。一个长度为\(n\)的\(01\)序列,其每个子序列的异或和的和为\([序列中包含1]2^{n-1}\)。证明:考虑若不存在\(1\),则显然。否则若存在\(1\),随便选一个......
  • 【CF888G】Xor-MST(01Trie,最小生成树)
    看到异或最值要么是线性基要么是01Trie。线性基显然可以排除。那么先把所有的\(a_i\)插入01Trie内。然后发现对于任意两个数\(a_i\)和\(a_j\):你发现它们在\(......
  • POJ 1222(Gauss消元xor版)
    EXTENDEDLIGHTSOUTDescriptionLightsOut就是下图的游戏,给你一个5*6的矩阵. 你的目标是把灯全关上. 0表示关,1表示开.Input第一行为数据......
  • ARC139F Many Xor Optimization Problems
    题意:给定\(n,m\),求\(n\)个\([0,2^m)\)的数的最大异或和的和。瞎扯:考虑线性基,考虑消元后的,显然唯一,最大异或和为基内所有数的异或和。考虑大小为\(k\)的基方案数为......
  • 【luogu AGC034F】RNG and XOR(FWT)
    RNGandXOR题目链接:luoguAGC034F题目大意给你一个长度为2^n的数组A。一开始有一个\(0\)数,然后每次你随机给它异或上0~2^n-1中的数,随机到\(i\)的概率跟Ai+1......