0. 「OurOJ #46942」/「51nod #1824」染色游戏
Private link & Submission .
首先,显然有
f ( t ) = t ∑ i = 0 ( t i ) r i b t − i . f ( t ) = ∑ i = 0 t ( t i ) r i b t − i .
这是一个卷积的形式,但是我们需要求出卷积结果在 mod 2 mod 2 意义下的值。从这个 ( t i ) ( t i ) 入手,发现 ( t i ) = 1 ( mod 2 ) ⇔ i ∈ t ( t i ) = 1 ( mod 2 ) ⇔ i ∈ t (i i 在二进制表示下是 t t 的子集)。也就是说,我们可以直接用子集卷积替代加法卷积 ,O ( n log 2 n ) O ( n log 2 n ) 求出卷积结果。
1. 「CF 662C」Binary Table
Link & Submission .
注意到当行上(列上)的操作全部确定后,列上(行上)每种操作是否进行可以贪心决策。这提示我们枚举一部分,算另一部分。因为有 n ≪ m n ≪ m ,我们来暴力枚举行上的 2 n 2 n 种操作是否进行,并在每一列分别算出最小 1 1 的数量。但这个怎么优化呢?
难以转化的地方在于“算出最小 1 1 的数量”,涉及到取 min min ,我们干脆直接把表打出来:令 [ x S ] F ( x ) [ x S ] F ( x ) 表示某一列为 S S 时,其仅通过列操作能得到最小 1 1 的数量。在这个比较构造性的转化之后,接下来的工作就很简单了——令 [ x S ] G ( x ) [ x S ] G ( x ) 为原表格中长相为 S S 的列的出现次数,那么
R ( x ) = F ( x ) × ⊕ G ( x ) , R ( x ) = F ( x ) × ⊕ G ( x ) ,
其中 × ⊕ × ⊕ 表示异或卷积。可见 [ x T ] R ( x ) [ x T ] R ( x ) 就是行操作为 T T 时的答案。复杂度 O ( n m + n 2 n ) O ( n m + n 2 n ) 。
2. 「WC 2018」「洛谷 P4221」州区划分
Link & Submission .
一大坨式子和离奇限制砸脸——哦,原来是状压题。
一个连通块合法的条件为:该连通块的诱导子图不存在欧拉回路,即不连通或者存在奇度点。
状压连通性等一系列处理可以快速求出每个连通块是否合法。记 f ( S ) f ( S ) 表示划分好 S S 集合内的点的贡献和,那么
f ( S ) = ∑ S ′ ∩ T = ∅ , S ′ ∪ T = S [ T is legal ] ( ∑ u ∈ T w ( u ) ∑ u ∈ S w ( u ) ) p f ( S ′ ) . f ( S ) = ∑ S ′ ∩ T = ∅ , S ′ ∪ T = S [ T is legal ] ( ∑ u ∈ T w ( u ) ∑ u ∈ S w ( u ) ) p f ( S ′ ) .
又是子集卷积的形式。注意显然有 | T | > 1 | T | > 1 ,所以当引入子集卷积的状态形式 f ( | S | , S ) f ( | S | , S ) 时,转移仍然没有环。直接 O ( n 2 2 n ) O ( n 2 2 n ) 算出来即可。
3. 「THUPC 2019」「洛谷 P5406」找树
Link & Submission .
众所周知位独立的运算,特别是这种有交换律的运算,都能用魔改 FWT 支持其卷积。边 ( u , v ) ( u , v ) 的边权 v v 做正变换得到向量 v v ,此时一棵生成树的点权定义为边上向量的点积。点积可以分开算,所以算 w w 次矩阵树可以求到记录所有权值的生成树数量的序列 R R 做正变换后的结果,把 R R 逆变换一下,找到最高非 0 0 位即可。
生成树数量很大?随便那一个大素数取模。复杂度是 O ( w n 3 ) O ( w n 3 ) ,但你看这是洛谷 / LOJ 还开了 4 s 4 s 就放心大胆写了叭。
4. 「JOI 2018 Final」「LOJ #2351」毒蛇越狱
Link & Submission .
一堆堆 10 6 10 6 让人不禁去想单 log log ,没想到正解甚至不是 polylog。
自然,我们希望找到某种“前缀和”来加速查询过程,继而想到本质上为高维前缀和的 and 变换和 or 变换。不妨记原序列为 f f ,and 变换得到序列 g g ,or 变换得到序列 h h 。
但,例如直接用 g g 来查询,问题很大——如果某个 bit 限制为 1 1 ,查询结果没有问题;但如果某个 bit 限制为 0 0 ,根据 and 卷积的规则,我们会将一些这一 bit 为 1 1 的数加入答案。补救一下?我们对 0 0 bit 的位置做容斥,即枚举哪些 0 − 0 − bit 变成了 1 1 ,我们确实就能得到答案。
然后就是比较 constructive 的一点:用 g g 查询,容斥 0 − 0 − bit;用 h h 查询,容斥 1 − 1 − bit;用 f f 查询,枚举 ? − ? − bit,复杂度平衡,得到 O ( L 2 L + Q 2 L / 3 ) O ( L 2 L + Q 2 L / 3 ) 的算法。
5. 「OurOJ Contest #2562」多项式佛跳墙
Private link .
现推了一遍,直接放草稿了,牛迭之类的地方跳步比较严重,估计会方便记忆(?)带讲解的版本可以看 这里 。板子从零开始不断累计,我交“多项式除法”的那发代码应该算是比较完整的全家桶。
可以发现,最难(步骤最长)的地方是二次剩余。(
Poly-Inversion u n v ≡ 1 ( mod x n ) u 2 n v 2 − 2 u n v + 1 ≡ 0 ( mod x 2 n ) v ( 2 u n − u 2 n v ) ≡ 1 ( mod x 2 n ) u 2 n = u n ( 2 − u n v ) Poly-Inversion u n v ≡ 1 ( mod x n ) u n 2 v 2 − 2 u n v + 1 ≡ 0 ( mod x 2 n ) v ( 2 u n − u n 2 v ) ≡ 1 ( mod x 2 n ) u 2 n = u n ( 2 − u n v )
Poly-Ln u = ln v u ′ = v ′ v u = ∫ u ′ d x = ∫ v ′ v d x Poly-Ln u = ln v u ′ = v ′ v u = ∫ u ′ d x = ∫ v ′ v d x
Poly-Exp p ( u , x ) = ln u − v = 0 u 2 n = u n ( 1 − ln u n + v ) Poly-Exp p ( u , x ) = ln u − v = 0 u 2 n = u n ( 1 − ln u n + v )
Poly-Sqrt p ( u , x ) = u 2 − v = 0 u 2 n = 1 2 ( u n + v / u n ) Poly-Sqrt p ( u , x ) = u 2 − v = 0 u 2 n = 1 2 ( u n + v / u n )
Quadratic-Residue (for odd primes) i 2 ≡ a 2 − n ( mod p ) (lemma) i p ≡ i ⋅ ( i 2 ) p − 1 2 ≡ − i ( mod p ) (lemma) ( a + b ) p ≡ a p + b p ( mod p ) ( a + i ) p + 1 ≡ a p + 1 + i p + 1 ≡ a 2 − i 2 ≡ n ( mod p ) ( ( a + i ) p + 1 2 ) 2 ≡ n ( mod p ) Quadratic-Residue (for odd primes) i 2 ≡ a 2 − n ( mod p ) (lemma) i p ≡ i ⋅ ( i 2 ) p − 1 2 ≡ − i ( mod p ) (lemma) ( a + b ) p ≡ a p + b p ( mod p ) ( a + i ) p + 1 ≡ a p + 1 + i p + 1 ≡ a 2 − i 2 ≡ n ( mod p ) ( ( a + i ) p + 1 2 ) 2 ≡ n ( mod p )
Poly-Division (with remainer) u = p v + r , deg r < deg v f R ( x ) := x deg f f ( x − 1 ) u R = p R v R + x deg u − deg v + 1 r R u R ≡ p R v R ( mod x deg u − deg v + 1 ) Poly-Division (with remainer) u = p v + r , deg r < deg v f R ( x ) := x deg f f ( x − 1 ) u R = p R v R + x deg u − deg v + 1 r R u R ≡ p R v R ( mod x deg u − deg v + 1 )
鬼故事:全部 O ( n log n ) O ( n log n ) 。
6. 「OurOJ #5430」yww 与连通块计数
Private link & Submission .
不考虑 gcd gcd 中的以及 lcm lcm 以外的因子,设数 a a 除 gcd gcd 以外的因子构成集合 S a S a ,那么连通块合法,等价于 S S 之交为 ∅ ∅ ,S S 之并为全集。
也就是说,对于每个元素 p p ,块内都有一个 p ∈ S 1 p ∈ S 1 也有一个 p ∉ S 2 p ∉ S 2 。
也就是说,存在一对邻接 的 u , v u , v ,[ p ∈ S a ( u ) ] ≠ [ p ∈ S a ( v ) ] [ p ∈ S a ( u ) ] ≠ [ p ∈ S a ( v ) ] 。
也就是说,令边 ( u , v ) ( u , v ) 的权 w ( u , v ) = S a ( u ) ⊕ S a ( v ) w ( u , v ) = S a ( u ) ⊕ S a ( v ) ,则连通块合法等价于 w w 之并为全集。
手动模拟 or-卷积,可以做到 O ( n 2 m ) O ( n 2 m ) ,其中 m = 15 m = 15 ,为 50 50 以内素数个数。
7. 「OurOJ #47016」排列问题
Private link & Submission .
灵活转换“计数视角”,“描述过程”而非“拼凑答案”。
令 F i ( x ) F i ( x ) 表示把颜色为 i i 的球放入若干不同盒子的 EGF,即
F i ( x ) = ∑ n ≥ 1 ( a i − 1 n − 1 ) x n n ! . F i ( x ) = ∑ n ≥ 1 ( a i − 1 n − 1 ) x n n ! .
那么,G ( x ) = ∏ i F i ( x ) G ( x ) = ∏ i F i ( x ) 即把所有盒子按颜色区分,放在一起的 EGF。相同盒子内的球必然贡献同色对,不同盒子间可能贡献同色对。所以 G ( x ) G ( x ) 亦可以转化为“至少有若干同色对”的 EGF。合并石子 O ( m log 2 m ) O ( m log 2 m ) 求出 G ( x ) G ( x ) ,二项式反演卷出答案的 GF 即可。
8. 「JLOI 2016」「洛谷 P3270」成绩比较
Link & Submission .
令 ans K ans K 表示答案。先钦定 K K 个被碾压的人的标号,然后考虑每种课程,枚举 B 神的得分组合一下,有
ans K = ( N − 1 K ) M − 1 ∏ i = 0 ( N − K − 1 R i − 1 ) ∑ j ( U i − j ) R i − 1 j N − R i = ( N − 1 K ) M − 1 ∏ i = 0 ( N − K − 1 R i − 1 ) R i − 1 ∑ k = 0 ( R i − 1 k ) U R i − 1 − k i ( − 1 ) k ∑ j ≤ U i j N − R i + k . ans K = ( N − 1 K ) ∏ i = 0 M − 1 ( N − K − 1 R i − 1 ) ∑ j ( U i − j ) R i − 1 j N − R i = ( N − 1 K ) ∏ i = 0 M − 1 ( N − K − 1 R i − 1 ) ∑ k = 0 R i − 1 ( R i − 1 k ) U i R i − 1 − k ( − 1 ) k ∑ j ≤ U i j N − R i + k .
最后一项自然数幂和可以随意拉插算出来。不过交上去得到了 90 90 分的好成绩,猛然发现,被碾压的人一定被碾压,但根据式子,没被碾压的人实际上也可能被碾压。所以还需要对 ans ans 二项式反演一下。注意和式 ∑ R i − 1 k = 0 ⋯ ∑ k = 0 R i − 1 ⋯ 与 K K 无关,可以先预处理出来。
如果实现得优美,可以做到 O ( M N 2 ) O ( M N 2 ) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-05-04 Solution -「AGC 016F」Games on DAG