Atcoder abc272
https://atcoder.jp/contests/abc272/tasks
G - Yet Another mod M
给长n数列A, distinct( ai != aj)
问是否存在 m \in [3,1e9]
使得 a[i]=a[i]%m 后,
有一半以上的数为某个x,(存在x使得x的个数 > 非x的个数)
范围
n 5000
ai 1e9
2s
1024mb
我的思路
感觉又是数论什么的, 不过这个n 5000 不知道是有什么n^2的说法吗
首先假设 能有x(m) 满足
显然 若p为m的因子
那么 这些 xi%m == x(m) 的 对应 xi%p = (xi%m)%p = x(m) %p 依然满足
所以只用考虑 质数 和 2 * 质数
, 又因为2*质数
如果合法,则质数
合法, 当为2^幂次时, 校验4即可
所以 只用考虑 质数
如果本来就有数字次数大于一半, 那么随便取
否则必定会让原来不等的两个数相等
考虑两个不等的数 ai,aj
ai % m == aj % m
(ai-aj) %m = 0
所以枚举质因子
但这样是 n^2 sqrt(ai) n
感觉并过不了? 上质因子拆解模版?
还是先收集完(ai-aj)
然后同时进行质因数查找
关键验证还需要n
(ai-aj)%m == 0 等价与 它们mod m后相等
换句话说, 收集ai-aj 后
如果 有t > n/2个值相等
那么两两成边 t(t-1)/2 条边, 即 ai-aj 需要 >= t(t-1)/2
这样的话 直接在收集后 的ai-aj 中枚举m????(O(max(ai/2)))
不会
题解
同样 |Ai-Aj| 是M的倍数
可以枚举 约数
反复 靠 概率 乱搞…..
Crying
一定有相邻的被选, 或者n=奇数, 间隔一个选一个
因此 M 一定是 某个|A_{i+1}-A{i}|的因数, 或者是 gcd(|A_{奇+2}-A_{奇}|
同上, 只用校验质数和4
注意到 sum d <= 1e9
而这里 复杂度是 (sum sqrt(d)) = sqrt(ai d) 能找出所有可能的质因数
O(质数个数 * 校验) = (9 * n) * n
O(sqrt(ai d) + 9 n^2)
注意到这里distinct 说明 不会有相等, 所以 相邻的差也不会为0
代码
https://atcoder.jp/contests/abc272/submissions/35948377
1 |
|
Ex - Flipping Coins 2
n 个硬币
初始都正面朝上
给定长n的序列A包含0..N-1
然后 会等概率选 A的一个排列, A[p[]]
第i次(0-index), 把 硬币[i … i + A[p[i]]] 翻转, 超界取mod
翻转n次后, 得到朝上的硬币个数的价值
问: 得到的价值的期望值 mod 998244353
范围
n 2e5
10s
1024mb
我的思路
一上来, 想的就是 map[处理前的状态][剩余可选ai] = 次数
但这显然大得离谱
稍微缩小一下状态就是 可以根据max(ai) 推得哪些 位置不再会变,然而这样对数量级影响来说没卵用
然后发现 如果min(ai) = t
那么意味着从每个开始都 翻转了长度 > t个
而注意到 虽然a[p[]] 会影响结果, 但是对于给定的a[p[]] 来说, 先a[p[i]] 还是先a[p[j]] 不会影响
所以如果t>=1等价于所有 a[i]-=2, (a[i]=-1表示不翻转)
这样可以让翻转的长度最小变为1(a[i]==0)或0(a[i]==-1)
对于最大最小差距大的情况 似乎并没什么卵用
上面注意到 实施翻转的顺序 并不会影响结果
换句话说, 每个位置其实是等价的,
那么一个位置被覆盖的奇偶性%2 的期望 * n
就是答案了
那么为了避免循环, 考虑说 最后一个位置被奇数个,偶数个覆盖的概率
而一个a[i] 让 最后一个n 被覆盖的概率就是 长度/n, 这个概率对应的是的奇偶交换
所以ans = n * ( prod (长/n) or 1-prod(长/n))
, 根据n的奇偶性来决定
就没了?
有点问题, 首先可以看到 长可以-2, 让上面式子不等
问题出在, 长Ai放在pi 和长Aj放在pi 不能同时发生
所以 要计算的是 同时cover的翻转概率 显然不能 prod 分别的概率
其实是 有偶数个 a[i]-p[i] >= 0 的概率
题解
下面$A,B,C$全是 1-index
问题转化
首先A的顺序不影响, sort(A)
和我分析的一样 所有硬币朝上概率等价, 不妨直接算最后一个硬币朝上的概率 = 朝上的排列方案数/n!
F(K) = 让最后一个硬币翻转K次的排列方案数
F(K) = 恰好有K个(P[i] >= N-1-Ai) 的排列方案数
为了方便 $B_i=N-1-A_i$, 所以B是非严格递减
容斥原理
上面的F(K)难以直接计算
找满足 集合S中所有i满足 $P_i\ge B_i$ 的 排列的个数$Count(S)$
令$G(L) = \sum_{S\subset\lbrace 1,2,\cdots,N\rbrace |S|=L} Count(S)$
$G(L) = \sum_{L\le K}\binom{K}{L} F(K)$, 一个具体的恰好K次的方案P, 在F(K)中贡献1, 而这K个满足的不等式中任选L个构成的集合S也是满足, 而 这个 方案P 通过 S 在 G(L=|S|) 贡献1
据说在arc140f题解中(我还没补) 有二项式反演
所以如果能有G, 那么可以二项式反演算F
$F(K) = \sum_{K\le L}(-1)^{L-K} \binom{L}{K} G(L)$
复杂度$O(n \log n)$
二项式反演
演绎推理是我们在数学中经常遇到的一些方法。对于数列来说,通过原数列计算出新的数列叫作演绎,而通过计算出的数列反推出原数列则被称为反演
$f(n)=\sum\limits_{i=n}^m{i\choose n}g(i)\Leftrightarrow g(n)=\sum\limits_{i=n}^m(-1)^{i-n}{i\choose n}f(i)$
证明: 见 参考中 的’反演’
快速计算
令 $a_i = (m−i)!g(m−i)$, $b_i = (m−i)!f(m−i)$
有
$a_j = (m-j)!g(m-j) $
$= \sum_{i=m-j}^m (-1)^{i-(m-j)} \frac{i!f(i)}{(i-(m-j))!} $
$= \sum_{i=0}^j (-1)^{(m-i)-(m-j)} \frac{(m-i)!f(m-i)}{((m-i)-(m-j))!} $
$= \sum_{i=0}^j \frac{(-1)^{j-i}}{(j-i)!}b_i$, 标准的$a_i = \sum b_j c_{i-j}$ 形式
一个fft, $O(n \log n)$搞定
注意到 $ e^{-x} = \sum \frac{(-1)^{i}}{i!}$
相当于生成方程 $a(x)=b(x)e^{-x}$, 注 这也是一种 反演推导可以用的路径
还有其它形式的二项式反演
$O(n^2)$ 解法
dp[i][j] =
排列P的前i个中, 有j个指定的 满足$P_k\ge B_k$ 的P的选择方案数, 对于未指定的位置可以满足也可以不满足
dp[i][j] = (N-Bi-(j-1)) dp[i-1][j-1](指定i) + dp[i-1][j] (不指定i)
, 注意到B非严格单调递减, 说明了前面消耗的P都比当前 Bi 大, 所以是N-Bi-(j-1)
G[L] = dp[N][L](N-L)!
, 集合S 对应 L=|S| 每个满足的S 中固定的P[S[]]
对 dp[N][L]
贡献1, 对G[L]
贡献(N-L)!
这里 $N-Bi-(j-1)$ 可能为负数吗, 那应该对应0值? 还是允许负值,还是预先判断?
其实 这说明 >= Bi 的P的个数小于长度, 所以这种是无解的状态(方案数为0)
如果i-1的都正确计算了, 那么 显然 dp[i-1][j]=0
如果之前已经发生无解了, 那么dp[i-1][j-1] = 0
不受到系数影响(即如果系数是负数 会让前面转移的时候就已经是0,不会影响结果
如果之前有dp[i-1][j-1]
的方案, 那么说明这里刚刚好不够了, 系数为0
所以始终可以直接使用这个值
$O(n \log^2 (n))$ 解法
令 $f[i][j] = dp[i][i-j], j \le i$, 因为$j > i$时全为0, 因为希望 转化成(Ci+j) * [j] + K*[j-1]
的形式,同时有$dp[i][j]=f[i][i-j]$
则 $f[i][j] = {dp}[i][i-j] $
$= (N-B_i-(i-j-1)){dp}[i-1][i-j-1]+ {dp}[i-1][i-j]$
$= (N-B_i-(i-j-1)){f}[i-1][j]+ {f}[i-1][j-1]$
$ = (N-B_i + 1 -i+ j){f}[i-1][j]+ {f}[i-1][j-1]$
令 $C_i = N-B_i+1-i$
$ = (C_i + j){f}[i-1][j]+ {f}[i-1][j-1]$, 题解这部分的-1有问题
考虑 $f_i(x)$为 $f[i]$ 的生成方程
有$f_i(x) = C_i f_ {i-1}(x) +xf’_ {i-1}(x) +xf_ {i-1}(x)=x(f_{i-1}(x)+f’_ {i-1}(x)) + C_i f_ {i-1}(x).$
$f_i(x)e^x = x(f_{i-1}(x)e^x+f’_ {i-1}(x)e^x) + C_i f_ {i-1}(x)e^x$
$f_i(x)e^x = x(f_{i-1}(x)e^x)’ + C_i f_ {i-1}(x)e^x$, 其实这里的想法就是 求导 看成系数左平移, 乘$x$看成右平移, 需要建立一个 平移量为0的等式, 同时第二项虽然 平移量 满足, 但是不是 fe^x形式, 这里看起来刚好
$\lbrack x^j \rbrack f_i(x)e^x = \lbrack x^j\rbrack (x(f_{i-1}(x)e^x)’ + C_i f_ {i-1}(x)e^x)$
令$g_{i} = f_i(x)e^x$,有系数$g_{i,j} = [x^j]f_i(x)e^x$
有系数关系$g_{i,j} = jg_{i-1,j} + C_i g_{i-1,j} = (j+C_i) g_{i-1,j} = g_{0,j} \prod_{k=1}^i (j+C_i)$
定义 $h(x) = \prod_{i=1}^N (x+C_i)$
这就是多项式多点求值
如果不变形dp
$dp[i][j] = (C_i-(j-1))dp[i-1][j-1] + dp[i-1][j]$
$f_i(x) = xC_i f_ {i-1}(x) -x^2f’_ {i-1}(x) +f_ {i-1}(x)$
$f_i(x)t_i(x) = xC_i f_ {i-1}(x)t_i(x) -x^2f’_ {i-1}(x)t_i(x) +f_ {i-1}(x)t_i(x)$
若 $f_i(x)t_i(x) = k_0 x(f_ {i-1}(x)t_{i-1}(x))’ + k_1f_ {i-1}(x)t_{i-1}(x)$
$k_0xt_{i-1}(x) = -x^2 t_{i}(x)$
$k_0xt_{i-1}’(x) + k_1t_{i-1}(x) = xC_it_{i}(x) + t_i(x)$
似乎没法搞, 所以可以看到 根本问题在于j 与 j-1 , j 的系数关系
只要形状是 $[j] = (C_i+k_0j)[j] + k_1[j-1]$的, <————– 这就是转化动机
就可以变成$f=C_if+k_0xf’ + k_1xf$, $\frac{k_1}{k_0}$ 是整数
$e^{\frac{k_1}{k_0}x}f=C_ie^{\frac{k_1}{k_0}x}f+k_0xe^{\frac{k_1}{k_0}x}f’ + k_1xe^{\frac{k_1}{k_0}x}f$
$e^{\frac{k_1}{k_0}x}f=C_ie^{\frac{k_1}{k_0}x}f+k_0x(e^{\frac{k_1}{k_0}x}f)’$
Multipoint evaluation 多项式多点求值
可以见37zigen写的, 更细节一些(日文)
给一个n次多项式 f(x), 和长m的整数序列 x
有办法在O(m log^2 m + n log n) 时间复杂度内算完 f(x1)…f(xm)
根据 多项式余数定理, f(a) = f(x) mod (x-a)
能算出 f(x) mod (x-xi)
分治思想, 考虑从叶子构造二叉树, 叶子(x-x1),(x-x2),(x-x3)….,(x-xn), 每个节点为它的两个叶子的乘积
因为 f mod g = (f mod gh) mod g
所以计算 f mod (x-xi) 可以沿着二叉树 从根到叶子做mod
这样算的话 注意到每层 取模的 规模减半, 问题落在如何做多项式除法/取模
如果个数n不是2的幂次, 通过叶子补1, 把n补成2的幂次即可
所以对于 x1
f(x) = g(x)(x-x1) + (f(x) % (x-x1))
f(x1) = (f(x) % (x-x1))(x1)
注意到 (f(x) % (x-x1)) 其实是常数项
多项式 除法/模运算
$F(x)=G(x)Q(x)+R(x)$ 其中$R(x) = F(x) \mod G(x)$, F为n次, G为m次, 则Q(x)为 n-m次, R(x)不超过 m-1次
$F(\frac{1}{x})=G(\frac{1}{x})Q(\frac{1}{x})+R(\frac{1}{x})$, 同时乘上$x^n$
$x^n F(\frac{1}{x}) = x^m G(\frac{1}{x}) x^{n-m} Q(\frac{1}{x}) + x^{m-1} R(\frac{1}{x}) x^{n-m+1}$
这里如果$A(x)$是i次多项式 那么 $ x^i A(\frac{1}{x})$ 相当于对A做系数倒转
$rev(F)(x) = rev(G)(x)rev(Q)(x) + x^{n-m+1} rev(R)(x)$
$rev(F)(x) = rev(G)(x)rev(Q)(x) \pmod{x^{n-m+1}}$
$rev(Q)(x) = rev(F)(x) (rev(G)^{-1})(x) \pmod{x^{n-m+1}} $ 这里需要多项式 求逆
有了Q 的话, $R = F-GQ$ 也就很好求了
多项式 求逆
即$A(x) A^{-1}(x) \equiv 1 \pmod{x^n}$
若 $A(x)B(x) \equiv 1 \pmod{x^n}$, 有$A(x)B(x) \equiv 1 \pmod{x^{\lceil\frac{n}{2}\rceil}}$
若 $A(x)C(x) \equiv 1 \pmod{x^{\lceil \frac{n}{2} \rceil}}$ 有
$B(x)-C(x) \equiv 0 \pmod{x^{\lceil \frac{n}{2}\rceil}}$
$(B(x)-C(x))^2 \equiv 0 \pmod{x^n}$
$A(x)(B(x)-C(x))^2 \equiv 0 \pmod{x^n}$, 因为 所有小于n次项 至少由一个小于 $\lceil \frac{n}{2} \rceil$项构成,
$A(x)B(x)B(x)-2A(x)B(x)C(x)+A(x)C(x)C(x) \equiv 0 \pmod{x^n}$
$B(x)-2C(x)+A(x)C(x)C(x) \equiv 0 \pmod{x^n}$
$B(x)= C(x)(2-A(x)C(x)) \pmod{x^n}$
ftiasch
考虑 从0,0 走到 n,k 的路径方案数, 每次移动的方案数不是1, 而是上面dp的转移系数
编码调试
- $g_0 = f_0(x) e^x = 1\cdot e^x = e^x$, 因为$dp[0][0]=1, dp[0][>0] = 0$
- $h(x) = \prod_{i=1}^N (x+C_i) $,然后$h(0..N)$ 多项式多点求值, $C_i = N-B_i+1-i = N-(N-1-A_i)+1-i = A_i+2-i$
- $g_n[i] = g_0[i] h(i) 对应位置相乘$ for一遍 $O(N)$
- $f_n = g_n e^{-x}$ fft
- $G[L] = dp[n]\lbrack L \rbrack (N-L)! = f_n\lbrack n-L \rbrack L!$
- 二项式反演 $F(K) = \sum_{K\le L}(-1)^{L-K} \binom{L}{K} G(L)$
- 根据K 奇偶统计 得到概率, 概率 * n 就是期望
拿样例数据
1 | 2 |
1 | N=2 |
代码
人傻常数大 5765 Byte 4283ms
https://atcoder.jp/contests/abc272/submissions/35978028
1 |
|
总结
G
靠概率的不打算学了
crying这个相邻的性质应该很明显啊,我自己咋就想不到
有想到说可以排序, 但没想到排序能带来什么好处, 这里看起来是 相邻的差的和小于最大最小的差, 这样让sqrt的质因数分解总的代价也不会过大
Ex
- 多项式多点求值
- 多项式除法/取mod
- 多项式求逆
- 二项式反演
- 形如
dp[i][j] = (Ci+j)dp[i-1][j] + dp[i-1][j-1]
的DP优化
这里问题转化的部分其实做到了
看来是容斥原理完全不会了, 在不往后看得话, 我也没有直观的直觉,觉得G更好算,我考虑的容斥 在想能否一步到一个明显好算的但没想出
参考
- 多项式多点求值
https://37zigen.com/multipoint-evaluation/
https://rsk0315.hatenablog.com/entry/2020/04/05/190941
- Hakone Ekiden DP
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2439&lang=jp
https://atcoder.jp/contests/abc134/tasks/abc134_f