来自学长的馈赠8 社论

IOI 赛制 suki

A. 跳一跳

递推可以 \(O(n)\) .

对每个点考虑贡献然后错位相减可以得到答案是 \(\displaystyle f(n)=\dfrac1{n-1}-\dfrac1{n(n-1)}+1-\dfrac1n+\sum_{i=1}^{n-1}\dfrac 1i\) .

可以分段打表优化,或者前面无脑逆元后面的调和级数用多项式科技优化,这样就是 \(O(\sqrt n\log n)\) 的了 .

B. 求和

首先 \(g(n)\) 直接扩展欧拉定理递归就可以在 \(O(\log n)\) 步内求出 .

然后分段打表即可,\(O(n\log n)\)\(10^7\) 的表也不是很慢 .

C. 明明的随机数

\(f_i\) 表示有 \(i\) 个不限制的行,\(m\) 个互不相同的列的方案数 . \(g_i\) 表示有 \(i\) 个互不相同的行,\(m\) 个互不相同的列的方案数,则

\[f_i=\sum_{j=1}^i{i\brace j}g_i \]

Stirling 反演即得

\[g_i=\sum_{j=1}^i(-1)^{i-j}{i\brack j}f_i \]

注意到 \(f_i=(c^i)^{\underline m}\),于是 \(g\) 就好求了 .

我们先算出 \(k_1\times k_2\) 的方案然后乘 \(\displaystyle{n\brace k_1}{m\brace k_2}\) 即可 .

第一类 Stirling 数可以直接递推 \(O(k_1k_2)\) 做,乘用的第二类 Stirling 数可以用

\[k!{n\brace k}=\sum_{i=1}^k(-1)^{k-i}\dbinom kii^n \]

直接暴力模拟,\(O(k_1+k_2)\) .


Bonus:\(O(n\log n)\) 做法 .

我不会复杂度分析,于是令 \(n,m,k_1,k_2\) 同阶 .

首先一行第一类 Stirling 数可以倍增做到 \(O(n\log n)\) .

那么考虑如何快速求 \(f_i=(c^i)^{\underline m}\) .

下降幂化普通幂:

\[x^{\underline n}=\sum_k{n\brack k}(-1)^{n-k}x^k \]

第一类 Stirling 数我们已经求过了,于是我们只需要求上面那个玩意在 \(c^i\) 处的取值 .

然后就是 CZT 板子了吧,可以 \(O(n\log n)\) .

总时间复杂度 \(O(n\log n)\) .

D. 凯爹博弈

so lazy,

posted @ 2022-08-02 21:09  Jijidawang  阅读(82)  评论(0编辑  收藏  举报
😅​