Atcoder abc213
F - Common Prefixes
题目
https://atcoder.jp/contests/abc213/tasks/abc213_f
给长n字符串S
求其每个位置开始的后缀字符串, 和所有其它后缀字符串的 公共前缀和
范围
n 1e6
3s
1024mb
https://atcoder.jp/contests/abc213/tasks/abc213_f
给长n字符串S
求其每个位置开始的后缀字符串, 和所有其它后缀字符串的 公共前缀和
n 1e6
3s
1024mb
快速沃尔什-阿达玛转换(Fast Walsh-Hadamard transform), 一种广义傅立叶变换(FWHT)
FWHT 是用于解决对下标进行位运算卷积问题的方法
$c_{i} = \sum_{i=j \bigoplus k}a_{j} b_{k}$
并且没有fft中会涉及到double
前置知识 FFT(DFT)
DFT:
${\displaystyle {\begin{bmatrix}f_{0}\\
f_{1}\\
\vdots \\
f_{n-1}\end{bmatrix}}={\begin{bmatrix}1&1&1&\cdots &1\\
1&\alpha &\alpha ^{2}&\cdots &\alpha ^{n-1}\\1&\alpha ^{2}&\alpha ^{4}&\cdots &\alpha ^{2(n-1)}\\\vdots &\vdots &\vdots &&\vdots \\1&\alpha ^{n-1}&\alpha ^{2(n-1)}&\cdots &\alpha ^{(n-1)(n-1)}\\\end{bmatrix}}{\begin{bmatrix}v_{0}\\v_{1}\\\vdots \\v_{n-1}\end{bmatrix}}.}$
https://atcoder.jp/contests/abc212/tasks/abc212_g
给定 质数$p$
问 $x,y\in[0,p-1]$ 中有多少对$(x,y)$满足
存在$n$, 使得$x^n = y \pmod p$
p $10^{12}$
2s
1024mb
显然x=0 只有y = 0, y=0也只有x=0
然后如果x是原根 那么 方案数$p-1$
如果$r|(p-1)$ 那么 $x^r \pmod p$的方案数为$\frac{p-1}{r}$
或者$x$的最小幂次$t$让$x^t = 1 \pmod p$, 则答案为$t$
但是即使这样, 如果每个去枚举依然是$O(p log(p))$
反过来考虑说有没有办法求$x^t = 1$ 的方案数,
如果能快速计算出,那么 方案数减去它的t因子对应的方案数 就恰好是 = t的方案数
而$t$的取值只会是 $p-1$的因数
$t = 1$ $x = 1$
$t = 2$ $x = 1,-1$
$t = 4$
$t = 7$
$t = 8$
t = 2k时, $x^{2k} - 1 = 0 \pmod p$
$(x^k+1)(x^k-1) = 0 \pmod p$, 相当于$x^k = 1 \pmod p, x^k = -1 \pmod p $的解的并
并不会
原根的想法没问题, 然后就变成了我们指定原根
$x^i = j$, $(i,j)$ 是一一对应, 且取$[1,p-1]$范围内的所有值
这样的话
要求 $x^i$ 的最小让 幂次等于1的t
注意到 和我思路一样的 $x^i$当$i | (p-1)$时, 方案数 $=\frac{p-1}{i}$
而这里$i$可能不是$p-1$的因子, 而易证明 方案数为 $\frac{p-1}{gcd(p-1,i)}$
这里问题变成了, 统计不同 $gcd(p-1,i) = k$ 的数量即可
$g | (p-1)$
$\sum_{g|(p-1)} count(g 倍数 且非(p-1)因子) $
https://atcoder.jp/contests/abc212/submissions/33524525
1 | #include <bits/stdc++.h> |
https://atcoder.jp/contests/abc212/tasks/abc212_h
给正整数 长度k的 数组A, 值两两不同
T和A轮流游戏, T先
选一个 >= 1 的石堆, 移除任意正整数个
谁取了最后一个胜利
问题是
对于长度[1,N] 每个元素属于A中的一个的 初始状态, 有多少种状态是 T 胜利
模 998244353
n 2e5
k 65536
$a_i$ [1, 65536]
首先nim游戏作为博弈的常见基础, 很明显 就是 xor 和 != 0 时 T胜利
那么无非是求 所有 !=0 的方案数, 或者 是 == 0 的方案数, 去总方案减去 ==0的方案数
那么对于一个选择来说因为Ai两两不同, 偶数次被选的Ai 不影响xor,奇数次被选的Ai影响一次
问题变成了说
选x个Ai,让它们 xor = 0, 那么
对于长度x 贡献是 x!
对长度x+2 贡献是 ?? 还是x, 但是剩余两个是一样的, 这两个一样的如果属于x个值内注意不要重复统计,不属于x个数内,则穿插即可
对于给定的数组长度M
$C=(C_0,C_1,…C_{2^{16}-1})$ 表示 下标的值 是否存在, 相当于选择了一次
定义xor的卷积 $Z_k = \sum_{i\oplus j=k} X_i Y_j$
那么$C$的M次卷积的结果$R$中的$R_0$, 就是期望值
快速沃尔什-阿达玛转换(Fast Walsh Hadamard transform), 一种广义傅立叶变换
FWT/FWHT 是用于解决对下标进行位运算卷积问题的方法, 见下面我的博客链接
$C_{i} = \sum_{i=j \bigoplus k}A_{j} B_{k}$
因为 xor 的卷积满足结合率, 所以可以考虑快速幂来算
注意到$C * C = ifwt(fwt(C)\odot fwt(C))$
而$C * C * C= ifwt(fwt(C * C) \odot fwt(C))$
$= ifwt(fwt(ifwt(fwt(C)\odot fwt(C))) \odot fwt(C))$
$= ifwt(fwt(C)\odot fwt(C) \odot fwt(C))$
即是 $C^n = ifwt(\left( fwt(C)_ i^n\right))$
所以 $C$的$n$次+/xor/or/and卷积等于 正变换每个位置的$n$次方后的逆变换, 这个在dft(fft)/ntt/fwt 同理
令 $I = C^0 = (1,0,0,0,0,0,\cdots)$
答案 $R = C + C * C + \cdots + C^n$
$R * C = C^2 + C^3 + \cdots + C^{n+1}$
$R * (C-I) = C^{n+1} - C$
$fwt(R) \odot fwt(C-I) = fwt(C^{n+1} - C)$
$fwt(R) = fwt(C^{n+1} - C) \oslash fwt(C-I)$
$R = ifwt(fwt(C^{n+1} - C) \oslash fwt(C-I))$
注意到$fwt$ 实际是线性变换, 所以也有$fwt(a+b) = fwt(a) + fwt(b),fwt(a-b) = fwt(a) - fwt(b),$
$R = ifwt( (fwt(C^{n+1}) - fwt(C)) \oslash (fwt(C)-fwt(I)))$
注意到 $fwt(I) = (1,1,1,1,1,\cdots)$
$R = ifwt(\left(\frac{fwt(C)_ i^{n+1} - fwt(C)_ i}{fwt(C)_ i - 1}\right))$
至此就很好写了
https://atcoder.jp/contests/abc212/submissions/33545657
1 | #include <bits/stdc++.h> |
G
没观察到选了一个原根以后 整个范围 都有幂次和值的一一映射
H(Ex)
首先这个C和这个卷积 就很神奇, 完全没有向这个方向的思路
学了一手FWT/FWHT
竟然Div2能出现NTT 虽然是在最后一题, 还是得学一学
是多项式乘法带模数的情况计算卷积
并且没有fft中会涉及到double,
NTT 也就是关于任意 环(数学术语) 上的离散傅立叶变化(DFT), 有限域的情况下,通常成为数论变换
回顾离散傅立叶变换, 就是
原函数(原向量) $\to$ DFT(离散傅立叶) $\to$ 点乘 $\to$ IDFT(逆傅立叶) $\to$ 结果函数(结果向量)
DFT:
$\hat{x}[k]=\sum_{n=0}^{N-1} e^{-i\frac{2\pi}{N}nk}x[n] \qquad k = 0,1,\ldots,N-1.$
IDFT:
$x\left[n\right]={1 \over N}\sum_{k=0}^{N-1} e^{ i\frac{2\pi}{N}nk}\hat{x}[k] \qquad n = 0,1,\ldots,N-1.$
有时系数可以是两个$\frac{1}{\sqrt{N}}$
矩阵表示的DFT, 是一个线性算子
${\displaystyle {\begin{bmatrix}f_{0}\\f_{1}\\\vdots \\f_{n-1}\end{bmatrix}}={\begin{bmatrix}1&1&1&\cdots &1\\1&\alpha &\alpha ^{2}&\cdots &\alpha ^{n-1}\\1&\alpha ^{2}&\alpha ^{4}&\cdots &\alpha ^{2(n-1)}\\\vdots &\vdots &\vdots &&\vdots \\1&\alpha ^{n-1}&\alpha ^{2(n-1)}&\cdots &\alpha ^{(n-1)(n-1)}\\\end{bmatrix}}{\begin{bmatrix}v_{0}\\v_{1}\\\vdots \\v_{n-1}\end{bmatrix}}.}$