Defining LATEX macros…
0.「集训队互测 2018」「LOJ #2504」小 H 爱染色 ✡️
Link & Submission.
Tags:「A.数学-多项式」「A.数学-数学推导」「A.数学-Stirling 数/反演」「B.Tricks」
破题的关键在于对 F(A) 中 Ai 的处理. 这个 A 可以理解作前缀白球数量, 而为了免于枚举 "前缀", 我们可以把 "前缀" 理解作 "Ai 对应的对象被定序在两次染色对应的对象之前" 这样的组合情景. "定序" 自然只能对小球定序, 那么我们思路就是把前后两项分别转化为 "选一些小球" 的方案数, 然后将选出来的小球一起放入长度为 n 的可用序列, 就能求出答案.
对于 Ai, Stirling 反演恰好提供了一个很好的转化: 枚举 "在 A 个球中任选有序可重复的 i 个球" 时, 最终被选过的球数. 对于两次染色, 直接枚举最终被染黑的求数就能完成转化. 枚举多项式的次数 i, Ai 中被选过的球数 j, 被染黑的球数 k, 可以表达出答案:
ans=m∑i=0fii∑j=0{ij}j!2m∑k=m(km)(mk−m)(nj+k)=m∑j=02m∑k=mj!⋅(km)(mk−m)⋅(nj+k)m∑i=jfi{ij}=m∑j=02m∑k=mj!⋅(km)(mk−m)⋅(nj+k)m∑i=0fi1j!j∑t=0(−1)j−t(jt)ti=m∑j=02m∑k=mj!⋅(km)(mk−m)⋅(nj+k)j∑t=0(−1)j−tj!(jt)m∑i=0fiti=m∑j=02m∑k=mj!⋅(km)(mk−m)⋅(nj+k)j∑t=0F(t)t!⋅(−1)j−t(j−t)!=m∑j=02m∑k=mj!f(j)⋅g(k)(nj+k)=3m∑s=m(ns)∑j+k=sj!f(j)g(k).
化简比较初等, 就不解释了. 算 f 和答案各需要一次多项式乘法. 复杂度 O(mlogm).
Remark.
最初表达式中的 (nj+k) 不动声色的讲述了 "第一个黑色之前的白色才算数" 这一信息, 感觉是一个不错的思维 trick.
1.「LOJ #6402」yww 与校门外的树
Link & Submission.
Tags:「A.数学-多项式」「A.数学-生成函数」
对于一个排列, 将其所有顺序对连双向边. 题目即求所有排列连通块大小乘积之和.
设 F(z) 为组合成单个连通块的方案数关于排列长度的 OGF, P(z) 为排列数量关于排列长度的 OGF. 则显然有 ∑i≥0Fi(z)=P(z), 得 F(z)=1−P−1(z). 答案就是 [zn]11−ϑF(z) 啦. 复杂度 O(nlogn).
2.「集训队互测 2019」「LOJ #3075」组合数求和 ✡️
Link & Submission.
Tags:「A.数学-数学推导」「B.Tricks」
fc=[zc]n−1∑i=0(1+z)id=[zc]1−(1+z)n1−(1+z)d.
但凄神寒骨, 悄怆幽邃的是, M 是任意的, d (分母约掉 z 之后的常数项) 甚至可能不与 M 互素. 我们势必需要用 CRT 之类的东西来抢救这个做法. 对于 M 的一个极大素因子幂 pα, 我们希望求出
F(z)=n−1∑i=0(1+z)idmodpα.
虽然多项式没有逆, 但乘法关系还是可以表达的. 若令
G(z)=1−(1+z)dzmodpα, H(z)=1−(1+z)ndzmodpα;
就有 H(z)≡F(z)G(z). 想要求 F(z), 由于 G,H 的系数非常平凡, 对比两侧系数:
[zc]H(z)=c∑i=0[zc−i]F(z)⋅[zi]G(z).
拎出与 p 互素的最靠前的 [zk]G(z), 表达此时我们想求的一个 [zt]F(z), 有
[zk]G(z)⋅[zt]F(z)=[zk+t]H(z)−k−1∑i=0[zt+k−i]F(z)⋅[zi]G(z)−t+k∑i=k+1[zt+k−i]F(z)⋅[zi]G(z).
发生了什么呢? 红色部分一定有 t+k−i<t, 我们可以尝试递推求出 [zt]F(z). 同时注意到, 蓝色部分一定是 p 的倍数. 若对于所有满足 j>k 的 [zj]F(z), 再次用 [zk]G(z)⋅[zj]F(z) 迭代, 蓝色 × 蓝色一定是 p2 的倍数, 其余项都是可算或可递推的. 迭代 α 次之后, 蓝色当场消失! 我们由此就能生成 [zt]F(z) 的递推是啦!
迭代的复杂度是 O(mdα+d2k2), 总复杂度是一大坨. 建议学会了就行, 不要写这托答辩.
Remark.
其实想到了迭代多次消除 p 的高次式子, 但没有想到利用 "不太行" 的 GF 关系列出等式观察系数. 这个题有点高科技啊.
3.「LibreOJ Round #10」「LOJ #565」mathematican 的二进制
Link & Submission.
Tags:「水题无 tag」
显然进位次数和操作顺序无关. 从低到高维护当前积压 bit 的出现概率关于积压 bit 数量的 GF, 每次 GF 长度会减半, 然后用分治 FFT 乘上当前 bit 的修改. 复杂度 O(nlog2n) (n,m 同阶).
4.「集训队互测 2019」「洛谷 P6262」神树大人挥动魔杖 @
Link. 嘴巴了.
Tag:「A.数学-数学推导」
设 hi 表示一个人走到 i 的方案数, 那么 hi=phi−1+qhi−2. 考虑容斥限制 "每个格子都被踩过", 令 fi 表示 m 个人走到 i, 钦定未走过 i−1 的带容斥系数方案数, 枚举上次被钦定未走过的格子, 则
fi=−i−2∑j=1(qhi−j−1)mfj.
再令 gi 表示 n=i 时的答案, 则
gi=i∑j=1(hi−j+1+qhi−j)mfj.
接下来的工作是求答案. 设 F(z),G(z),H(z) 分别为三个序列的 GF, 对于 H(z), 显然有
H(z)=z+pzH(z)+qz2H(z)=z1−pz−qz2.
引入其特征根
Δ=p2+4q, α=p+√Δ2, β=p−√Δ2;
可以将其分解为
H(z)=A1−αz+B1−βz,
那么有 h 的通项
hi=Aαi+Bβi.
我们还需要研究 H(z)=∑ihmizi, 直接代入通项:
H(z)=∑i≥0zim∑j=0(mj)AjαijBm−jβi(m−j)=n∑j=0(mj)AjBm−j∑i≥0αijβi(m−j)zi=m∑j=0(mj)AjBm−j1−αjβm−jz.
到此, 若令 H(z)=P(z)Q−1(z), 则 Q(z)=∏j(1−αjβm−jz). 同理, F(z),G(z) 也可以化简作有理分式. 用 Bostan-Mori 求答案即可. 复杂度 O(mlogmlogn).
5.「SDOI 2013」「洛谷 P3307」项链
Link & Submission.
Tag:「A.数学-Pólya 计数」
首先考虑求出珠子的种类数 c. 做一个小小的容斥, 若令
c3=a∑i=1a∑j=1a∑k=1∑d∣i,d∣j,d∣kμ(d)=a∑d=1μ(d)⌊a/d⌋3,c2=a∑i=1a∑j=1∑d∣i,d∣jμ(d)=a∑d=1μ(d)⌊a/d⌋2,c1=a∑i=1∑d∣iμ(d)=a∑d=1μ(d)⌊a/d⌋=1;
则显然有 c=16(c3+3c2+2c1).
接下来就是一个纯纯的 Polya 计数. 设用 c 种颜色染长为 ℓ 的环, 相邻点不同色的方案数为 f(ℓ,c), 有个耳熟能详的结论是 f(ℓ,c)=(c−1)⋅(−1)ℓ+(c−1)ℓ. 注意这个项链只允许旋转不允许翻转, Polya 一下就是
ans=n−1∑i=0f(gcd(i,n),c)=∑d∣nf(d,c)φ(n/d).
答案是 ans/n, 但 n 可能没有逆元, 所以需要在 P2 下完成运算再除掉 P 因子. 单次复杂度 O(d(n)+m).
6.「THUPC 2019」「洛谷 P5376」过河卒二
Link & Submission.
Tag:「A.数学-组合计数」
先考虑简单的行走的方案数. 设 f(i,j) 表示走出位移向量 (i,j) 的方案数, 显然
f(i,j)=f(i−1,j)+f(i,j−1)+f(i−1,j−1).
引入 GF 简单优化一下,
Fi(z)=Fi−1(z)+zFi(z)+zFi−1(z)=1+z1−zFi−1(z)=(1+z)i(1−z)i+1
到此我们得到了一个 O(min{a,b}) 算 f(a,b) 的方法, 由于 m,k 都挺小, 差不多够用了.
我们还需要求从一个位置走出棋盘的方案数. 设从 (0,0) 走出边界 (i,j) 的棋盘的方案数为 g(i,j), 这里有必要考虑到 i≫j, 那么
g(i,j)=3f(i,j)+2i−1∑k=0f(k,j)+2j−1∑k=0f(i,k)=3f(i,j)+2[zi−1](1+z)j(1−z)j+2+2[zj−1](1+z)i(1−z)i+2.
虽然递推组合数很别扭但还是可以 O(min{a,b}) 地算, 于是乎容斥一发就 O(mk2) 做完了.
模数是素数但很小, 需要用 a×pw 表示所需的一些值.
UPD: 首先, 我是伞兵. 其次, g(i,j)=f(i+1,j+1).
7.「AHOI/HNOI 2017」「洛谷 P3726」抛硬币 📓
Link & Submission.
Tag:「A.数学-组合计数」
当 a=b 时, 答案为即非平局数量的一半, 即
ans=12(2a+b−a∑i=0(ai)2)=2a+b−1−12(2aa).
沿着这一思路讨论 a>b 的情形. 注意到 a−b 挺小, 我们可以做一个小小的讨论: 将所有 A 胜的方案分为所有硬币翻转后 B 胜的方案和所有硬币翻转后是 A 胜或平局的方案. 讨论的目的很自然: 如果能算出后者, 我们就能沿用 "非平局数量的一半" 这个思路了.
设第二类方案中, A 有 wa 枚正面硬币, B 有 wb 枚正面硬币, 则它们需要满足 wa>wb 且 a−wa≥b−wb, 即 a−b≥wa−wb>0. 可见 wa−wb 是可枚举的. 则此类方案数 c 可以表示为 (i 枚举 wb, j 枚举 wa−wb):
c=b∑i=0a−b∑j=1(bi)(ai+j)=a−b∑j=1b∑i=0(bb−i)(ai+j)=a−b∑j=1(a+bj+b).
顺便写出答案:
ans=12(2a+b−b∑i=0(ai)(bi)+c)=2a+b−1−12(a+bb)+12a−b∑j=1(a+bj+b).
还要写扩展 Lucas, 真是令人眼前一黑.
「扩展 Lucas」
没写过博客, 回忆一下.
欲求 (nm)modpα. 设 wp(x)=max{pk ∣∣ pk∣x}, 我们可以通过 Legendre 定理轻松地求出 wp(n!), 接下来需要处理的问题是
n!/wp(n!)m!/wp(m!)⋅(n−m)!/wP((n−m)!)modpα,
当然下面的家伙是有逆元的, 所以只需要解决形如
n!/wp(n!)modpα
这样的问题.
n!=n∏i=1i=n/p∏i=1ip⋅∏i≤n,p∤ii[≡](n/p)!⋅⎛⎝∏i<pα,p∤ii⎞⎠n/pα∏⌊n/pα⌋pα≤i≤n,p∤ii.
[≡] 大概指 "在这种语境下同余", 相信你看得懂. (
递归下去算, 复杂度 O(pαlogpn).
对于本题, 可以预处理 mod210 和 mod59 的扩展 Lucas (2 的幂预处理到 k+1 次幂是因为计算过程中有一个 ÷2), 后续的计算都是 O(logn) 的了.
8.「LOJ #6503」Magic
Link & Submission.
Tags:「A.数学-生成函数」「A.数学-多项式」
魔术对仅出现于相邻同色元素, 可以发现不同色元素相对独立. 设 Gs(z) 表示一个数量为 s 的颜色中, 方案数关于钦定的连通块数的 EGF, 那么
Gs(z)=s∑i=1zii!(s−1i−1).
全局方案数关于钦定的连通块数的 EGF 则为
G(z)=m∏i=1Gai(z).
对 G(z) 二项式反演一下就好. 注意写的时候想清楚 "连通块数" 和 "魔术对数" 组合意义上的关系. 瓶颈复杂度是分治 FFT 的 O(nlog2n).
9.「集训队作业 2020」「LOJ #3398」带加强和多项木 📓✡️
Link & Submission. (题目中的有根树是儿子有序, 结点无标号的树.)
Tags:「A.数学-生成函数」「A.数学-Lagrange 反演」「B.Tricks」
冥冥之中看过这题题解的样子… 不会是在梦里吧.
设 F(z) 为铁树数量关于叶子数量的 GF, 显然
F(z)=z+∑i∈DFi(z).
我们希望求出 [zn]F(z). 看到这样的 GF 形式, 审时度势之后, 我立马滚去复习 Lagrange 反演.
学成归来, 一眼盯真:
G(z)=z−∑i∈Dzi,G(F(z))=z.
拉反:
[zn]F(z)=[zn−1]G′(z)(zG−1(z))n+1.
注意这里需要用变形形式规避模意义下可能无意义的 1n.
到这里, 这道题才露出了她的邪恶爪牙: 我们需要算一个多项式的超级高次幂模一个超级小模数.
「EI 科技: 小模数下的多项式幂」
名字瞎编的, 不过 EI 的确写过关于这个的博客, 不知道有没有好哥哥帮我找找. (
先考虑对素数 p 取模的情况. 对于多项式幂的处理, 有一个很小巧的结论:
Fp(z)≡F(zp)(modp).
简单 Lucas 定理可证.
利用这一结论, 我们可以尝试一个递归解法. 假设我们希望求出 [zm]A(z)Bn(z)modp, 令 m=pkm+rm,n=pkn+rn, 那么
[zm]A(z)Bn(z)=[zpkm+rm](A(z)Brn(z))Bpkn(z),
此时令 A(z)Brn(z)=∑p−1r=0zrCr(zp), 则
[zm]A(z)Bn(z)≡[zpkm+rm]zrmCrm(zp)Bpkn(z)≡[zpkm]Crm(zp)Bkn(zp)≡[zkm]Crm(z)Bkn(z)(modp).
设 A(z),B(z) 的次数均为 O(w), 预处理所有 Br(z), 我们能得到 O(w2p2)−O(w2logpn) 的算法.
接下来考虑对素数幂 pα 取模的情况. 第一项任务自然是找到类似上面的结论. 我们发现:
Fpα(z)≡Fpα−1(zp)(modpα).
可以归纳证明. 当 α=1 时显然成立. 接下来由 α 归纳向 α+1. 设 Fpα(z)=Fpα−1(z)+pαR(z), 那么
Fpα+1(z)=(Fpα−1(zp)+pαR(z))p=p∑i=0(pi)Fipα−1(zp)⋅pα(p−i)Rp−i(z)≡Fpα(zp)(modpα+1).
两个红色项加持下, 仅有 i=p 时内部模意义下非 0. 由此完成归纳.
□
回到对 [zm]A(z)Bn(z)(modpα) 的求解. 令 A0(z)=A(z)Bnmodpα−1, B0(z)=Bpα−1(z), n0=⌊n/pα−1⌋, 这样 n0 上的 p 因子就能用结论直接放入 B0(z), 由此得到和模 p 时完全一样的递归形式. 其复杂度为 O(w2p2α)−O(w2p2α−2logpn). 所有多项式乘法为暴力卷积.
顺带一提, 结论的推导与 n 并不相关, 因此可以不加任何修正地处理 n<0 的情况.
这道题也就这样啦, 拉反之后套用上诉算法求解, 再 CRT 合并出答案就好 直接枚举答案检查是否合法就好. 最坏复杂度 O(k2m2)−O(k2m2logmn).
Remark.
学会一道这样的数学题真的治愈, 喜欢科技发明家们.
(是鲜花捏.)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现