CF1515E Phoenix and Computers (2200)
最后一定是若干段全都手动打开的电脑,每一段中间有一台自动开启的电脑。
将 一台自动开启-一段手动开启 视作一整段,则长度为 l l 的一段方案数是 2 n − 2 2 n − 2 (先随意开启一台电脑,之后只能选择向左或向右拓展)。
写成生成函数后二项式展开即可,时间复杂度 O ( n 2 ) O ( n 2 ) 。(式子不见了)
CF1621G Weighted Increasing Subsequences (3200)
考虑对每一个元素 a i a i 计算贡献。
设 x x 为最后一个大于 a i a i 的 a a 下标,则符合条件的上升序列可以分为两段:[ 1 , i ] [ 1 , i ] 中以 i i 为结尾的上升子序列 及 [ i , x ) [ i , x ) 中以 i i 为开头的上升子序列。
前者很好算,后者则是 [ i , n ] [ i , n ] 中以 i i 为开头的上升子序列个数 减去 [ i , x ] [ i , x ] 中以 i i 为开头,x x 为结尾的上升子序列个数。
考虑枚举每一个 x x 。符合条件的 x x 一定满足其等于后缀 max max 。那么对应的 i i 一定在这个 x x 到下一个 x x 之间,直接抽取出来做即可。
时间复杂度 O ( n log n ) O ( n log n ) 。
P6944/LOJ3405 [ICPC2018 WF]Gem Island
洛谷这么有实力的吗
考虑最后每个人拿(增加)的绿宝石数量 a i a i ,其概率为:
( d a 1 , a 2 , ⋯ , a n ) a 1 ! a 2 ! ⋯ a n ! n ( n + 1 ) ⋯ ( d + n − 1 ) = 1 ( d + n − 1 n − 1 ) ( d a 1 , a 2 , ⋯ , a n ) a 1 ! a 2 ! ⋯ a n ! n ( n + 1 ) ⋯ ( d + n − 1 ) = 1 ( d + n − 1 n − 1 )
所以只需要对 { a } { a } 统计即可。
考虑一个不知道怎么想到的 套路的 DP。设 f i , j f i , j 表示将 i i 有序拆分成 j j 个非负整数的方案数,g i , j g i , j 表示将 i i 有序拆分成 j j 个非负整数的前 r r 大和。
枚举有 k k 个数为正整数,并将它们减去 1 1 。于是有:
f i , j = ∑ k ( j k ) f i − k , k = ( i + j − 1 i − 1 ) f i , j = ∑ k ( j k ) f i − k , k = ( i + j − 1 i − 1 )
g i , j = ∑ k ( j k ) ( g i − k , k + min { r , k } f i − k , k ) g i , j = ∑ k ( j k ) ( g i − k , k + min { r , k } f i − k , k )
时间复杂度 O ( n d 2 ) O ( n d 2 ) 。
我们发现根本就不想这么 DP ,这种问题应该考虑容斥。
设 f i , j f i , j 表示恰好有 i i 个数大于等于 j j ,则答案即为 ∑ i , j min { i , r } f i , j ∑ i , j min { i , r } f i , j 。
设 g i , j g i , j 表示钦定有 i i 个数大于等于 j j ,则 g i , j = ( n i ) ( d − i j + n − 1 n − 1 ) g i , j = ( n i ) ( d − i j + n − 1 n − 1 ) 。
g k , j = ∑ i ≥ k ( i k ) f i , j g k , j = ∑ i ≥ k ( i k ) f i , j
f k , j = ∑ i ≥ k ( − 1 ) i − k ( i k ) g i , j = ∑ i ≥ k ( − 1 ) i − k ( i k ) ( n i ) ( d − i j + n − 1 n − 1 ) f k , j = ∑ i ≥ k ( − 1 ) i − k ( i k ) g i , j = ∑ i ≥ k ( − 1 ) i − k ( i k ) ( n i ) ( d − i j + n − 1 n − 1 )
这里有 j k ≤ d j k ≤ d ,i j ≤ d i j ≤ d ,可以枚举 j j 并 O ( ∑ i d 2 i 2 ) = O ( d 2 ) O ( ∑ i d 2 i 2 ) = O ( d 2 ) 计算。
我不满意!还可以进行一些优化。
A N S = ∑ k min { k , r } ∑ i ( − 1 ) i − k ( i k ) ( n i ) ∑ j ( d + n − i j − 1 n − 1 ) A N S = ∑ k min { k , r } ∑ i ( − 1 ) i − k ( i k ) ( n i ) ∑ j ( d + n − i j − 1 n − 1 )
改为枚举 i i :
A N S = ∑ i ( n i ) [ ∑ j ( d + n − i j − 1 n − 1 ) ] [ ∑ k ( − 1 ) i − k min { k , r } ( i k ) ] A N S = ∑ i ( n i ) [ ∑ j ( d + n − i j − 1 n − 1 ) ] [ ∑ k ( − 1 ) i − k min { k , r } ( i k ) ]
后面两部分分开预处理。
前面部分可以用狄利克雷后缀差分,时间复杂度 O ( n log log n ) O ( n log log n ) 。
后面部分:
d ∑ k = 1 min { k , r } ( − 1 ) k ( i k ) = min { d , r } ∑ k = 1 k ( − 1 ) k ( i k ) + r d ∑ k = r + 1 ( − 1 ) k ( i k ) ∑ k = 1 d min { k , r } ( − 1 ) k ( i k ) = ∑ k = 1 min { d , r } k ( − 1 ) k ( i k ) + r ∑ k = r + 1 d ( − 1 ) k ( i k )
设 t = min { d , r } t = min { d , r } ,实际上是要算:
f i = t ∑ k = 1 ( − 1 ) k ( i k ) = ( − 1 ) t ( i − 1 t ) − 1 f i = ∑ k = 1 t ( − 1 ) k ( i k ) = ( − 1 ) t ( i − 1 t ) − 1
g i = t ∑ k = 1 k ( − 1 ) k ( i k ) = − i [ f i − 1 + 1 − ( − 1 ) t ( i − 1 t ) ] g i = ∑ k = 1 t k ( − 1 ) k ( i k ) = − i [ f i − 1 + 1 − ( − 1 ) t ( i − 1 t ) ]
h i = d ∑ k = 1 ( − 1 ) k ( i k ) h i = ∑ k = 1 d ( − 1 ) k ( i k )
可以和答案一起算,时间复杂度 O ( n ) O ( n ) 。
总时间复杂度 O ( n log log n ) O ( n log log n ) 。
CF1630E Expected Components (2900)
最大的问题是如何去重,直接用带权 Burnside 引理:
∑ x w x | ¯ ¯ ¯ x | = 1 | G | ∑ g w ( X g ) ∑ x w x | x ¯ | = 1 | G | ∑ g w ( X g )
设有 d d 循环节的权值之和为 f d f d ,则答案为 1 n ∑ d f d φ ( n d ) 1 n ∑ d f d φ ( n d ) 。
以 f n f n 为例,由于要算的是和之和,对每种颜色分开计算。具体而言,将该颜色看作 1 1 ,其它颜色看作 0 0 ,最后再乘上其它颜色可重排即可。
枚举 1 1 恰有 t t 段,但若直接插板怎样不重不漏仍然是个问题。
用常见套路,枚举旋转最小角度。注意 0 0 位置不一定是 1 1 ,还要算 0 0 位置是 0 0 的情况。最后范德蒙德卷积即可做到 O ( 1 ) O ( 1 ) 。
设共有 q q 种颜色,则枚举的 d d 数量不超过 gcd { b i } ≤ min { b i } ≤ ⌊ n q ⌋ gcd { b i } ≤ min { b i } ≤ ⌊ n q ⌋ ,总时间复杂度是 O ( n ) O ( n ) 。
XXI OpenCup Grand Prix of SPb J Justice For Everyone
先考虑没有两个人不能相等的限制怎么做。
设 d i = b i − a i d i = b i − a i ,s = ∑ d i 2 s = ∑ d i 2 。
设 n n 元生成函数 F = ∑ 1 ≤ i < j ≤ n x i x j = 1 2 [ ( ∑ x i ) 2 − ( ∑ x 2 i ) ] F = ∑ 1 ≤ i < j ≤ n x i x j = 1 2 [ ( ∑ x i ) 2 − ( ∑ x i 2 ) ] ,则答案为 [ ∏ x d i i ] F s [ ∏ x i d i ] F s 。
大力展开:
A n s = [ ∏ x d i i ] F s = 1 2 s [ ∏ x d i i ] [ ( ∑ x i ) 2 − ( ∑ x 2 i ) ] s = 1 2 s [ ∏ x d i i ] s ∑ j = 0 ( s j ) ( − 1 ) j ( ∑ x 2 i ) j ( ∑ x i ) 2 s − 2 j = 1 2 s ∑ { e i } ( s ∑ e i ) ( − 1 ) ∑ e i ( ∑ e i e 1 , e 2 , ⋯ , e n ) ( ∑ d i − 2 ∑ e i d 1 − 2 e 1 , d 2 − 2 e 2 , ⋯ , d n − 2 e n ) A n s = [ ∏ x i d i ] F s = 1 2 s [ ∏ x i d i ] [ ( ∑ x i ) 2 − ( ∑ x i 2 ) ] s = 1 2 s [ ∏ x i d i ] ∑ j = 0 s ( s j ) ( − 1 ) j ( ∑ x i 2 ) j ( ∑ x i ) 2 s − 2 j = 1 2 s ∑ { e i } ( s ∑ e i ) ( − 1 ) ∑ e i ( ∑ e i e 1 , e 2 , ⋯ , e n ) ( ∑ d i − 2 ∑ e i d 1 − 2 e 1 , d 2 − 2 e 2 , ⋯ , d n − 2 e n )
枚举 { e i } { e i } 显然不现实,还是用生成函数做。对 d d 设 G d = ⌊ d / 2 ⌋ ∑ i = 0 1 i ! ( d − 2 i ) ! G d = ∑ i = 0 ⌊ d / 2 ⌋ 1 i ! ( d − 2 i ) ! ,则答案为:
A n s = 1 2 s s ∑ t = 0 ( s t ) ( − 1 ) t t ! ( 2 s − 2 t ) ! A n s = 1 2 s ∑ t = 0 s ( s t ) ( − 1 ) t t ! ( 2 s − 2 t ) !
回到原问题,该限制十分类似 LGV 引理的使用条件。将 G b j − a i G b j − a i 填入矩阵,计算行列式即可得到答案。
多项式项数为 O ( V 2 ) = 20000 O ( V 2 ) = 20000 较大,可以代值算行列式再多项式快速插值,总时间复杂度 O ( n 3 V 2 + V 2 log 2 V ) O ( n 3 V 2 + V 2 log 2 V ) 。
PTZ Camp2022 C3 Inversions
对每个 t t 暴力统计逆序对为 t t 的排列数量。设 F t ( x ) = t − 1 ∑ i = 0 x i F t ( x ) = ∑ i = 0 t − 1 x i ,G ( x ) = n ∏ t = 1 F t ( x ) G ( x ) = ∏ t = 1 n F t ( x ) ,答案即为 n ( n − 1 ) / 2 ∑ x = 0 i k g i ∑ x = 0 n ( n − 1 ) / 2 i k g i 。
需要做 n n 次值域为 n 2 n 2 和 n n 的卷积,时间复杂度 O ( n 3 ) O ( n 3 ) 。
下面假设计算期望。
如果 k = 1 k = 1 ,就是个人人都会 的经典问题:每对位置有 1 2 1 2 的概率产生一个逆序对,因此期望为 n ( n − 1 ) 4 n ( n − 1 ) 4 。
因此原问题相当于选出 k k 对位置,要求每对位置都是逆序对,显然可以分情况讨论得到对应概率。这些位置至多覆盖 2 k 2 k 个点,故答案一定为关于 n n 的 2 k 2 k 次多项式。然而由于点可以重复,情况数太多,无法直接计算。
同暴力算出 n = 1 ∼ 2 k n = 1 ∼ 2 k 时的答案,直接插值,时间复杂度 O ( k 3 ) O ( k 3 ) ,仍然无法接受。
考虑把 k k 次幂用斯特林数拆成下降幂,要求即 ∑ i i p – g i = G ( p ) ( 1 ) ∑ i i p _ g i = G ( p ) ( 1 ) 。
对于每个 F t ( x ) F t ( x ) 这个东西很好求。F ( p ) t ( 1 ) = t ∑ i = p i p – = ( t + 1 ) p – p + 1 F t ( p ) ( 1 ) = ∑ i = p t i p _ = ( t + 1 ) p _ p + 1 。
由莱布尼茨公式,G G 的 p p 次导可以通过对每个 F t F t 写出指数型生成函数 P t = ∑ i F ( i ) t x i i ! P t = ∑ i F t ( i ) x i i ! 卷积得到。
注意此时只需求 x 2 k x 2 k 以内的答案,于是时间复杂度变为 O ( k 3 ) O ( k 3 ) 。使用 NTT 优化即可做到 O ( k 2 log k ) O ( k 2 log k ) 。
最后我们算的是期望,还要乘上 n ! n ! 得到原来的答案,打个表即可。
PTZ Camp2022 H7 Hundred Thousand Points
随机变量不能当离散变量考虑。
首先由于 ∑ a i > 360 ∑ a i > 360 一定无解,所以 N N 是 O ( M ) O ( M ) 的。
容易发现 2 ∼ n − 1 2 ∼ n − 1 的角一定被完全包含在上半平面或下半平面,可以对 1 1 及 n n 的情况分类讨论,然后背包处理。
考虑如何分配空位计算答案,设上半平面的角共有 n u m 1 n u m 1 个,和为 v a l 1 v a l 1 ;下半平面的角共有 n u m 2 n u m 2 个,和为 v a l 2 v a l 2 ,则分配空位的概率为:
( 180 − v a l 1 ) n u m 1 ( 180 − v a l 2 ) n u m 2 n u m 1 ! n u m 2 ! ( 180 − v a l 1 ) n u m 1 ( 180 − v a l 2 ) n u m 2 n u m 1 ! n u m 2 !
(即先将角紧密排成一排,再在空位中插入 n u m n u m 个断点分配给每个空隙)
1 n u m 1 ! n u m 2 ! ∫ a i 0 ( 180 − v a l 1 − x ) n u m 1 ( 180 − v a l 2 − a 1 + x ) n u m 2 d x 1 n u m 1 ! n u m 2 ! ∫ 0 a i ( 180 − v a l 1 − x ) n u m 1 ( 180 − v a l 2 − a 1 + x ) n u m 2 d x
n n 跨越水平线,1 1 不跨越水平线的情况翻转同理。
1 n u m 1 ! n u m 2 ! ∫ a 1 0 ∫ a n 0 ( 180 − v a l 1 − x − y ) n u m 1 ( 180 − v a l 2 − a 1 − a n + x + y ) n u m 2 d x d y 1 n u m 1 ! n u m 2 ! ∫ 0 a 1 ∫ 0 a n ( 180 − v a l 1 − x − y ) n u m 1 ( 180 − v a l 2 − a 1 − a n + x + y ) n u m 2 d x d y
改为对 z = x + y z = x + y 积分。不妨设 a 1 ≤ a n a 1 ≤ a n ,则 z z 的贡献系数长这样:
综上,设 M = 180 M = 180 ,卷积部分 O ( M 3 ) O ( M 3 ) ,积分统计答案 O ( M 4 ) O ( M 4 ) (听说可以 NTT 优化到 O ( M 3 log M ) O ( M 3 log M ) )。
细节:积分时需要注意变量的上下界。
CF773E Special Positions (3300)
先把期望拆开,对每个位置算贡献。考虑第 i i 个位置,设 m m 个关键点到它的距离排序后为 d 1 , ⋯ , d m d 1 , ⋯ , d m ,则贡献为 m ∑ i = 1 d i 2 i ∑ i = 1 m d i 2 i 。
然而由于 i i 左右都有关键点,不方便排序,难以处理。
考虑不排序,直接计算 j j 到 i i 的贡献。设 p t p t 表示 t t 是否为关键点,c n t t = t ∑ i = 0 p i c n t t = ∑ i = 0 t p i ,p r e t = 2 c n t t p r e t = 2 c n t t 。
先考虑 j < i j < i 的情况,贡献为 ∑ j < i p j ( i − j ) p r e j − 1 p r e 2 i − j = i ∑ j < i p j p r e j − 1 p r e 2 i − j − ∑ j < i j p j p r e j − 1 p r e 2 i − j ∑ j < i p j ( i − j ) p r e j − 1 p r e 2 i − j = i ∑ j < i p j p r e j − 1 p r e 2 i − j − ∑ j < i j p j p r e j − 1 p r e 2 i − j ,两边分别做。
如果没有 j < i j < i 的限制就能直接卷积了。用 CDQ 分治(好像就是分治NTT ),每次让左区间的点做 NTT 贡献右边即可。
j > i j > i 的情况翻过来同理,注意 j j 与 2 i − j 2 i − j 都是关键点时会算重,改为计算 ∑ j < i p j ( i − j ) p r e j − 1 p r e 2 i − j − 1 ∑ j < i p j ( i − j ) p r e j − 1 p r e 2 i − j − 1 即可。
时间复杂度 O ( n log 2 n ) O ( n log 2 n ) 。
P8114 [Cnoi2021]六边形战士
Part 1
二分图完美匹配看起来难以处理……
一个奇特的想法:将所有灰边(非匹配边)割开,将每条匹配边分离开来,画一画:
十分的有立体感?不妨再把三种方向的菱形染成不同颜色:
事实上,原图的一种二分图完美匹配对应一种 a × b × c a × b × c 的立方形堆叠。证明见此 。
现在题目变成了立方体堆叠计数。这是经典问题,画出 1 ∼ c 1 ∼ c 的轮廓线,限制仅是轮廓线不能互相穿过:
将第 i i 条线的起点和终点都向右上平移 i i 格,这样就变成了轮廓线不能相交。
考虑 LGV 引理,第 i i 个起点到第 j j 个终点的方案数为 ( a + b a + i − j ) ( a + b a + i − j ) 。因此答案为:
A N S = det ( ( a + b a + i − j ) ) i , j A N S = det ( ( a + b a + i − j ) ) i , j
Part 2
把每一行拎出来提系数。第 i i 行为 ( a + b a + i − 1 ) , ( a + b a + i − 2 ) , ⋯ , ( a + b a + i − c ) ( a + b a + i − 1 ) , ( a + b a + i − 2 ) , ⋯ , ( a + b a + i − c ) ,提出 ( a + b ) ! ( a + i − 1 ) ! ( b + c − 1 ) ! ( a + b ) ! ( a + i − 1 ) ! ( b + c − 1 ) ! 就得到 ( a + i − 1 ) ! ( a + i − j ) ! ( b + c − i ) ! ( b + j − j ) ! = j − 1 ∏ k = 1 ( a + i − k ) c ∏ k = j ( b + k − i ) ( a + i − 1 ) ! ( a + i − j ) ! ( b + c − i ) ! ( b + j − j ) ! = ∏ k = 1 j − 1 ( a + i − k ) ∏ k = j c ( b + k − i ) 。
A N S = ( c ∏ i = 1 ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) det ( j − 1 ∏ k = 1 ( a + i − k ) c ∏ k = j ( b + k − i ) ) i , j = c ∏ i = 1 ( − 1 ) c − i ( c ∏ i = 1 ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) det ( j ∏ k = 2 ( a + i − k + 1 ) c ∏ k = j ( i − b − k ) ) i , j A N S = ( ∏ i = 1 c ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) det ( ∏ k = 1 j − 1 ( a + i − k ) ∏ k = j c ( b + k − i ) ) i , j = ∏ i = 1 c ( − 1 ) c − i ( ∏ i = 1 c ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) det ( ∏ k = 2 j ( a + i − k + 1 ) ∏ k = j c ( i − b − k ) ) i , j
套用题目给出的 Krattenthaler’s formula :
det ( j ∏ k = 2 ( x i + a k ) n ∏ k = j + 1 ( x i + b k ) ) i , j = ∏ 1 ≤ i < j ≤ n ( x i − x j ) ∏ 2 ≤ i ≤ j ≤ n ( a i − b j ) det ( ∏ k = 2 j ( x i + a k ) ∏ k = j + 1 n ( x i + b k ) ) i , j = ∏ 1 ≤ i < j ≤ n ( x i − x j ) ∏ 2 ≤ i ≤ j ≤ n ( a i − b j )
A N S = ( − 1 ) c ( c − 1 ) / 2 ( c ∏ i = 1 ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) ∏ 1 ≤ i < j ≤ c ( i − j ) ∏ 2 ≤ i ≤ j ≤ c ( a − i + b + j + 1 ) A N S = ( − 1 ) c ( c − 1 ) / 2 ( ∏ i = 1 c ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) ∏ 1 ≤ i < j ≤ c ( i − j ) ∏ 2 ≤ i ≤ j ≤ c ( a − i + b + j + 1 )
枚举 i − j i − j :
∏ 1 ≤ i < j ≤ c ( i − j ) = ( − 1 ) c ( c − 1 ) / 2 ∏ 1 ≤ i < j ≤ n ( j − i ) = ( − 1 ) c ( c − 1 ) / 2 c − 1 ∏ t = 1 t c − t = ( − 1 ) c ( c − 1 ) / 2 c − 1 ∏ t = 1 t ! ∏ 1 ≤ i < j ≤ c ( i − j ) = ( − 1 ) c ( c − 1 ) / 2 ∏ 1 ≤ i < j ≤ n ( j − i ) = ( − 1 ) c ( c − 1 ) / 2 ∏ t = 1 c − 1 t c − t = ( − 1 ) c ( c − 1 ) / 2 ∏ t = 1 c − 1 t !
∏ 2 ≤ i ≤ j ≤ c ( a − i + b + j + 1 ) = c − 2 ∏ t = 0 ( a + b + 1 + t ) c − 1 − t = c − 1 ∏ t = 1 ( a + b + t ) c − t = c − 1 ∏ t = 1 ( a + b + t ) t – ∏ 2 ≤ i ≤ j ≤ c ( a − i + b + j + 1 ) = ∏ t = 0 c − 2 ( a + b + 1 + t ) c − 1 − t = ∏ t = 1 c − 1 ( a + b + t ) c − t = ∏ t = 1 c − 1 ( a + b + t ) t _
到这里已经可以 O ( n ) O ( n ) 计算了。
我不满意!
A N S = ( c ∏ i = 1 ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) c − 1 ∏ t = 1 t ! c − 1 ∏ t = 1 ( a + b + t ) t – = c ∏ i = 1 1 ( a + i − 1 ) ! ( b + c − i ) ! c − 1 ∏ t = 1 t ! c − 1 ∏ t = 1 ( a + b + t ) ! A N S = ( ∏ i = 1 c ( a + b ) ! ( a + i − 1 ) ! ( b + c − i ) ! ) ∏ t = 1 c − 1 t ! ∏ t = 1 c − 1 ( a + b + t ) t _ = ∏ i = 1 c 1 ( a + i − 1 ) ! ( b + c − i ) ! ∏ t = 1 c − 1 t ! ∏ t = 1 c − 1 ( a + b + t ) !
记 H ( n ) = n − 1 ∏ i = 0 i ! H ( n ) = ∏ i = 0 n − 1 i ! ,就有:
A N S = H ( a ) H ( b ) H ( c ) H ( a + b ) H ( b + c ) H ( c + a ) H ( a + b + c ) A N S = H ( a ) H ( b ) H ( c ) H ( a + b ) H ( b + c ) H ( c + a ) H ( a + b + c )
总时间复杂度 O ( n ) O ( n ) 。
LOJ6215「美团 CodeM 决赛」bt
首先不得不考虑 u = v u = v 的情况,即为二叉树叶子个数之和。简单推一推可得 ( 2 ( n − 1 ) n − 1 ) ( 2 ( n − 1 ) n − 1 ) 。
k k 次幂难做,套路拆成下降幂及组合数:
l k = k ∑ i = 0 i ! S 2 ( k , i ) ( l i ) l k = ∑ i = 0 k i ! S 2 ( k , i ) ( l i )
转而数其组合意义。相当于在 u u 到 v v 的路径上特殊标记了 k k 个点,再数方案数。
考虑大力设出生成函数,多加一维 y y 表示标记 个数。设 F 0 , F 1 , F 2 F 0 , F 1 , F 2 分别表示子树内包含 u , v u , v 中 0 , 1 , 2 0 , 1 , 2 个点的生成函数(为了方便,这里不计算 u , v , l c a u , v , l c a 的贡献,最后乘上 x 3 ( 1 + y ) 3 x 3 ( 1 + y ) 3 即可)。有:
F 0 = 1 + x F 2 0 F 0 = 1 + x F 0 2
F 1 = 1 + 2 x ( y + 1 ) F 0 F 1 F 1 = 1 + 2 x ( y + 1 ) F 0 F 1
F 2 = F 2 1 + 2 x F 0 F 2 F 2 = F 1 2 + 2 x F 0 F 2
大力解得:
F 0 = 1 − √ 1 − 4 x 2 x F 0 = 1 − 1 − 4 x 2 x
F 1 = − 1 y − ( y + 1 ) √ 1 − 4 x F 1 = − 1 y − ( y + 1 ) 1 − 4 x
F 2 = 1 √ 1 − 4 x ( y − ( y + 1 ) √ 1 − 4 x ) 2 F 2 = 1 1 − 4 x ( y − ( y + 1 ) 1 − 4 x ) 2
令 t = √ 1 − 4 x t = 1 − 4 x ,则 F 2 = t − 3 [ 1 − ( t − 1 − 1 ) y ] − 2 F 2 = t − 3 [ 1 − ( t − 1 − 1 ) y ] − 2 。
先将 F 2 F 2 暴力展开成关于 y y 与 t − 1 t − 1 的二元多项式,再考虑 [ x n ] t − k = [ x n ] ( 1 − 4 x ) − k / 2 = [ x n ] ∑ i ( − k / 2 i ) ( − 4 ) i = ( − k / 2 n ) ( − 4 ) n [ x n ] t − k = [ x n ] ( 1 − 4 x ) − k / 2 = [ x n ] ∑ i ( − k / 2 i ) ( − 4 ) i = ( − k / 2 n ) ( − 4 ) n 。
至于一半组合数,暴力展开或者参考 x k – – ( x − 1 / 2 ) k – – = ( 2 x ) 2 k – – – 2 2 x x k _ ( x − 1 / 2 ) k _ = ( 2 x ) 2 k _ 2 2 x ,同样 O ( 1 ) O ( 1 ) 计算。
总时间复杂度 O ( n + m 2 ) O ( n + m 2 ) 。
LOJ3626「2021 集训队互测」愚蠢的在线法官
显然若有重复的 A i A i ,则有两列完全相同,行列式为 0 0 。
否则,由于交换 A i A i 及 A j A j 对行列式无影响,我们不关心 { A i } { A i } 的顺序。为了方便,假设 A i A i 是按 dfs 序排列的。
树的结构十分适合递归,考虑递归划分矩阵。
下面记两个子树对应的子矩阵中元素分别记为 A A ,B B ,减去 w u w u 后的元素分别记为 A ′ A ′ ,B ′ B ′ 。
若 u u 在 A A 中出现了,则矩阵大概长成这样:
⎡ ⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢ ⎣ w u w u ⋯ w u w u ⋯ w u w u A ⋯ A w u ⋯ w u ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ w u A ⋯ A w u ⋯ w u w u w u ⋯ w u B ⋯ B ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ w u w u ⋯ w u B ⋯ B ⎤ ⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥ ⎦ [ w u w u ⋯ w u w u ⋯ w u w u A ⋯ A w u ⋯ w u ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ w u A ⋯ A w u ⋯ w u w u w u ⋯ w u B ⋯ B ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ w u w u ⋯ w u B ⋯ B ]
用第一行消元,变为:
⎡ ⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢ ⎣ w u w u ⋯ w u w u ⋯ w u 0 A ′ ⋯ A ′ 0 ⋯ 0 ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ 0 A ′ ⋯ A ′ 0 ⋯ 0 0 0 ⋯ 0 B ′ ⋯ B ′ ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 0 B ′ ⋯ B ′ ⎤ ⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥ ⎦ [ w u w u ⋯ w u w u ⋯ w u 0 A ′ ⋯ A ′ 0 ⋯ 0 ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ 0 A ′ ⋯ A ′ 0 ⋯ 0 0 0 ⋯ 0 B ′ ⋯ B ′ ⋮ ⋮ ⋱ ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 0 B ′ ⋯ B ′ ]
注意到该矩阵的行列式即为 w u w u 乘上 { 1 } { 1 } 的主子行列式。
若 u u 没有出现,手动将矩阵内每个元素减去 w u w u 可以得到相同的形式。
问题变为如何快速计算某矩阵 M M 内每个元素同时加上 x x 后的行列式。有结论:设其为关于 x x 的函数 f ( x ) f ( x ) ,则 f ( x ) = a x + b f ( x ) = a x + b 。其中 b = det ( M ) b = det ( M ) ,a a 为 M M 的所有代数余子式之和。
详细推导如下:
det ( M ′ ) = ∑ P ( − 1 ) σ ( P ) ∏ i ( M i , P i + x ) = ∑ S ⊆ [ n ] x | S | ∑ P ( − 1 ) σ ( P ) ∏ i ∉ S M i , P i det ( M ′ ) = ∑ P ( − 1 ) σ ( P ) ∏ i ( M i , P i + x ) = ∑ S ⊆ [ n ] x | S | ∑ P ( − 1 ) σ ( P ) ∏ i ∉ S M i , P i
当 | S | ≥ 2 | S | ≥ 2 时,交换 P P 中不在 S S 中的两个元素,贡献会抵消。只考虑 | S | = 0 / 1 | S | = 0 / 1 的情况。
det ( M ′ ) = d e t ( M ) + x n ∑ t = 1 ∑ P ( − 1 ) σ ( P ) ∏ i ≠ t M i , P i det ( M ′ ) = d e t ( M ) + x ∑ t = 1 n ∑ P ( − 1 ) σ ( P ) ∏ i ≠ t M i , P i
后面的系数即为 M M 的所有代数余子式之和。
因此 DP 记录 f u = a f u = a 及 g u = b g u = b 。具体过程为:设递归到该层时所有元素已减去 d e l d e l ,先将子矩阵中的元素减去 w u − d e l w u − d e l 递归得到 DP 值,再合并,最后加回减去的 w u − d e l w u − d e l 。
转移时行列式直接相乘。考虑代数余子式,若选在两个子矩形以外的位置,则贡献为 0 0 。否则为其中一个子矩阵的行列式 乘上另一个子矩阵的代数余子式 。
即 g u ← f u g v + f v g u g u ← f u g v + f v g u ,f u ← f u f v f u ← f u f v 。
总时间复杂度 O ( n ) O ( n ) 。叶节点需要特判,有些细节。
LOJ3395「2020-2021 集训队作业」Yet Another Permutation Problem
与 ARC134F 也太像了吧
考虑如何判断一个排列能否在 k k 次操作内得到。显然充要条件为 存在连续 n − k n − k 个单调递增的数 。
容斥,计算所有极长单调递增连续段长度都小于 p = n − k − 1 p = n − k − 1 的排列个数。
后面的限制是简单的,可以直接对段长设生成函数 F = p ∑ i = 0 x i = 1 − x p + 1 1 − x F = ∑ i = 0 p x i = 1 − x p + 1 1 − x 并卷积;然而极长连续段的限制难以处理(直接卷会算重)。
使用同 ARC134F Flipping Coins 的方法,给每个长度赋一个新的权组成生成函数 A A ,并使 A A 任意组合后正好为 F F :
1 1 − A = F 1 1 − A = F
A = 1 − 1 F A = 1 − 1 F
于是答案就是 n ! [ x n ] 1 1 − ^ A n ! [ x n ] 1 1 − A ^ 。暴力实现 O ( n 3 ) O ( n 3 ) 。
注意到 1 F = 1 − x 1 − x p + 1 = ∑ d ( 1 − x ) x d ( p + 1 ) 1 F = 1 − x 1 − x p + 1 = ∑ d ( 1 − x ) x d ( p + 1 ) 只有 O ( ⌊ n p ⌋ ) O ( ⌊ n p ⌋ ) 项,因而对 F F 求逆的复杂度为 O ( n ⌊ n p ⌋ ) O ( n ⌊ n p ⌋ ) 。可以接受。
总时间复杂度 O ( n 2 ln n ) O ( n 2 ln n ) 。
2021ICPC 上海站 (GYM103446) B Strange Permutations
将 i i 向 P i P i 连边,合法的 Q Q 即不存在相邻的两个数 Q i Q i 与 Q i + 1 Q i + 1 相连。
大力对边容斥,若钦定了 k k 条边必须在 Q Q 中相邻,则对应方案数为 ( n − k ) ! ( n − k ) ! (每一条边相当于把两个位置合并)。
接下来只需要对每个 k k 算出钦定 k k 条边的方案数。对每个环,设其长为 l l ,则写出生成函数 F = ( 1 + x ) l − x l F = ( 1 + x ) l − x l ,将所有 F F 卷起来即可得到答案。
使用分治乘,时间复杂度 O ( n log 2 n ) O ( n log 2 n ) 。
2021CCPC 广州站 (GYM103415) K Magus Night
意识到 lcm ≥ p lcm ≥ p 十分的怪异(因为 lcm lcm 可以非常大) ,于是考虑容斥,计算 gcd ≤ q gcd ≤ q 的方案减去 gcd ≤ q ∧ lcm < p gcd ≤ q ∧ lcm < p 的方案。
第一个问题非常好算。设 f d f d 表示 gcd = d gcd = d 的方案,g d g d 表示钦定每个数都被 d d 整除的方案。则:
g d = ∑ i ∣ d f i g d = ∑ i ∣ d f i
可以莫比乌斯反演得到 f d = ∑ i ∣ d μ ( d i ) g i f d = ∑ i ∣ d μ ( d i ) g i 。
第二个问题用同样的方法,现在需要对每个 d d 求出每个数都被 d d 整除且 lcm < p lcm < p 的方案,即任意选数 lcm ≤ ⌊ p − 1 d ⌋ lcm ≤ ⌊ p − 1 d ⌋ 的方案。
再套容斥,设 p d p d 表示 lcm = d lcm = d 的方案,q d q d 为钦定每个数都整除 d d 的方案(可以通过算约数和处理)。则:
q d = ∑ d ∣ i p i q d = ∑ d ∣ i p i
可以用倍数莫比乌斯反演得到 p d = ∑ d ∣ i μ ( i d ) q i p d = ∑ d ∣ i μ ( i d ) q i 。
总时间复杂度 O ( m ( ln m + log n ) ) O ( m ( ln m + log n ) ) 。
LOJ3393「2020-2021 集训队作业」Game on Tree
记 u u 子树内叶子节点集合为 L u L u ,到 1 1 号点深度为偶数的非叶 节点集合为 A u A u ,深度为奇数的非叶 节点集合为 B u B u 。
考虑 DP。设 f u , i , j f u , i , j 表示 u u 的子树合法,Alice 的最优值为 i i 且 Bob 的最优值为 j j 的方案数。x u , i x u , i 表示 u u 的子树中 Alice 的最优值不超过 i i 的方案数;y u , i y u , i 表示 u u 的子树中 Bob 的最优值不超过 i i 的方案数。
考虑转移,不妨设 u ∈ A u ∈ A ,l l 与 r r 分别表示左右儿子,考虑 Alice 选择接在哪边,则有:
f u , i , j = f l , i , j x r , i + f r , i , j x l , i f u , i , j = f l , i , j x r , i + f r , i , j x l , i
x u , i = 2 x l , i x r , i x u , i = 2 x l , i x r , i
y u , i = 2 | A r | + | B r | k 2 | L r | y l , i + 2 | A l | + | B l | k 2 | L l | y r , i y u , i = 2 | A r | + | B r | k 2 | L r | y l , i + 2 | A l | + | B l | k 2 | L l | y r , i
注意到 x x 与 y y 似乎关联性不大。考虑做一些变换使 x x 与 y y 独立。
朴素的想法是令 x ′ u , i = x u , i / ( 2 | A u | + | B u | k 2 | L u | i ) x u , i ′ = x u , i / ( 2 | A u | + | B u | k 2 | L u | i ) ,y ′ u , i = y u , i / ( 2 | A u | + | B u | k 2 | L u | i ) y u , i ′ = y u , i / ( 2 | A u | + | B u | k 2 | L u | i ) ,然而带入第三个式子后会出现 / 2 / 2 (因为 A u = A l + A r + 1 A u = A l + A r + 1 ),模数不为质数难以处理。
将 A A 和 B B 分开在 x x 与 y y 。令 x ′ u , i = x u , i / ( 2 | A u | k | L u | i ) x u , i ′ = x u , i / ( 2 | A u | k | L u | i ) ,y ′ u , i = y u , i / ( 2 | B u | k | L u | i ) y u , i ′ = y u , i / ( 2 | B u | k | L u | i ) ,则递推式变为:
f u , i , j = 2 | A r | k 2 | L r | f l , i , j x ′ r , i + 2 | A l | k 2 | L l | f r , i , j x ′ l , i f u , i , j = 2 | A r | k 2 | L r | f l , i , j x r , i ′ + 2 | A l | k 2 | L l | f r , i , j x l , i ′
x ′ u , i = i x ′ l , i x ′ r , i x u , i ′ = i x l , i ′ x r , i ′
y ′ u , i = 2 | A r | k | L r | y ′ l , i + 2 | A l | k | L l | y ′ r , i y u , i ′ = 2 | A r | k | L r | y l , i ′ + 2 | A l | k | L l | y r , i ′
这时发现 f u , i , j = x u , i y u , j f u , i , j = x u , i y u , j ,边界条件为 x l e a f , i = y l e a f , i = 1 x l e a f , i = y l e a f , i = 1 ,答案即为 ( ∑ x u , i ) ( ∑ y u , i ) ( ∑ x u , i ) ( ∑ y u , i ) 。
视多项式 F u ( x ) F u ( x ) 满足 F u ( i ) = x u , i F u ( i ) = x u , i 。由于上述转移过程中每次只会使多项式系数 + 1 + 1 ,所有节点系数的多项式至多为 n − 1 n − 1 。可以 O ( n 2 ) O ( n 2 ) 处理 0 ∼ n 0 ∼ n 的点值,再用拉格朗日插值得到答案。
具体而言,考虑拉格朗日插值公式:
F ( x ) = n ∑ i = 0 y i ∏ j ≠ i x − x j x i − x j F ( x ) = ∑ i = 0 n y i ∏ j ≠ i x − x j x i − x j
预处理出 l i ( k ) = ∏ j ≠ i k − x j x i − x j l i ( k ) = ∏ j ≠ i k − x j x i − x j ,每个询问带入求值即可。然而模数不是质数,无法取逆。
注意到拉格朗日基本多项式 l i ( x ) l i ( x ) 在 i i 处为 1 1 ,在 [ 0 , n ] ∖ { i } [ 0 , n ] ∖ { i } 处为 0 0 ,故其为整值多项式,一定可以表示为 n ∑ t = 0 c t ( x t ) ( c t ∈ Z ) ∑ t = 0 n c t ( x t ) ( c t ∈ Z ) 的形式。
有:
y p = p ∑ t = 0 c t ( p t ) = [ p = i ] y p = ∑ t = 0 p c t ( p t ) = [ p = i ]
c p = p ∑ t = 0 ( − 1 ) p − t y t ( p t ) = ( − 1 ) p − i ( p i ) c p = ∑ t = 0 p ( − 1 ) p − t y t ( p t ) = ( − 1 ) p − i ( p i )
l i ( k ) = n ∑ t = i ( − 1 ) t − i ( t i ) ( k t ) l i ( k ) = ∑ t = i n ( − 1 ) t − i ( t i ) ( k t )
只要处理出 ( k t ) ( k t ) 即可。
不断将组合数乘上 k − i + 1 k − i + 1 ,再除掉 i i ,运算过程不会出现分数。故将一个数分成两部分:其含 p p 的质因数的指数 及 与 p p 互质的部分,即可通过欧拉定理求逆。
时间复杂度 O ( n 2 ) O ( n 2 ) 。
LOJ3630「2021 集训队互测」Imbalance
记前缀和为 { s i } { s i } 。考虑 { s i − s i − k } { s i − s i − k } ,其为连续变化的(即差值在 [ − 1 , 1 ] [ − 1 , 1 ] 间),故要么所有 s i − s i − k < k 2 s i − s i − k < k 2 ,要么所有 s i − s i − k > k 2 s i − s i − k > k 2 。不妨考虑第一种情况,第二种情况反转同理。
将所有第 i i 个点画到第 i mod k i mod k 个位置上,会形成 ⌊ n k ⌋ ⌊ n k ⌋ 条折线。再将第 t t 条折线向下平移 t ⋅ k 2 t ⋅ k 2 (即对应 ( i mod k , s i − ⌊ i k ⌋ k 2 ) ( i mod k , s i − ⌊ i k ⌋ k 2 ) ),则原条件转化为 ⌊ n k ⌋ ⌊ n k ⌋ 条折线两两不交。
...
CF1654H Three Minimums (3500)
标记记号 c h e c k [ i , < ] = [ i > m ∨ s i = ′ < ′ ] c h e c k [ i , < ] = [ i > m ∨ s i = ′ < ′ ] ,c h e c k [ i , < ] = [ i > m ∨ s i = ′ > ′ ] c h e c k [ i , < ] = [ i > m ∨ s i = ′ > ′ ] 。
考虑一个序列是否是好的:
于是设计一个区间 DP。设 a ∗ ∗ ( l , r ) , a 1 ∗ ( l , r ) , a ∗ 1 ( l , r ) , a 12 ( l , r ) , a 21 ( l , r ) a ∗ ∗ ( l , r ) , a 1 ∗ ( l , r ) , a ∗ 1 ( l , r ) , a 12 ( l , r ) , a 21 ( l , r ) 分别表示对于区间 ( l , r ) ( l , r ) ,满足给定条件的「区间两端无限制」,「区间左端点为最小值」,「区间右端点为最小值」,「区间左端点为最小值,右端点为次小值」,「区间左端点为次小值,右端点为最小值」的方案数。于是有:
a ∗ ∗ ( l , r ) = r ∑ i = l a ∗ 1 ( l , i ) a 1 ∗ ( i , r ) ( r − l i − l ) a ∗ ∗ ( l , r ) = ∑ i = l r a ∗ 1 ( l , i ) a 1 ∗ ( i , r ) ( r − l i − l )
a 1 ∗ ( t , t ) = 1 , a 1 ∗ ( l , r ) = r ∑ i = l + 1 a 12 ( l , i ) a 1 ∗ ( i , r ) ( r − l − 1 i − l − 1 ) a 1 ∗ ( t , t ) = 1 , a 1 ∗ ( l , r ) = ∑ i = l + 1 r a 12 ( l , i ) a 1 ∗ ( i , r ) ( r − l − 1 i − l − 1 )
a ∗ 1 ( t , t ) = 1 , a ∗ 1 ( l , r ) = r − 1 ∑ i = l a ∗ 1 ( l , i ) a 21 ( i , r ) ( r − l − 1 i − l ) a ∗ 1 ( t , t ) = 1 , a ∗ 1 ( l , r ) = ∑ i = l r − 1 a ∗ 1 ( l , i ) a 21 ( i , r ) ( r − l − 1 i − l )
a 12 ( t , t + 1 ) = c h e c k [ t , < ] , a 12 ( t , t + 2 ) = c h e c k [ t , < ] c h e c k [ t + 1 , > ] , a 12 ( l , r ) = c h e c k [ l , < ] a 21 ( l + 1 , r ) + c h e c k [ r − 1 , > ] a 12 ( l , r − 1 ) a 12 ( t , t + 1 ) = c h e c k [ t , < ] , a 12 ( t , t + 2 ) = c h e c k [ t , < ] c h e c k [ t + 1 , > ] , a 12 ( l , r ) = c h e c k [ l , < ] a 21 ( l + 1 , r ) + c h e c k [ r − 1 , > ] a 12 ( l , r − 1 )
a 21 ( t , t + 1 ) = c h e c k [ t , > ] , a 21 ( t , t + 2 ) = c h e c k [ t , < ] c h e c k [ t + 1 , > ] , a 21 ( l , r ) = c h e c k [ l , < ] a 21 ( l + 1 , r ) + c h e c k [ r − 1 , > ] a 12 ( l , r − 1 ) a 21 ( t , t + 1 ) = c h e c k [ t , > ] , a 21 ( t , t + 2 ) = c h e c k [ t , < ] c h e c k [ t + 1 , > ] , a 21 ( l , r ) = c h e c k [ l , < ] a 21 ( l + 1 , r ) + c h e c k [ r − 1 , > ] a 12 ( l , r − 1 )
暴力做时间复杂度 O ( n 3 ) O ( n 3 ) ,无法接受。
答案为 a ∗ ∗ ( 1 , n ) a ∗ ∗ ( 1 , n ) ,故要对所有 k ∈ [ k , n ] k ∈ [ k , n ] 计算出 a ∗ 1 ( 1 , k ) a ∗ 1 ( 1 , k ) 及 a 1 ∗ ( k , n ) a 1 ∗ ( k , n ) 。
Part 1:a ∗ 1 ( 1 , k ) a ∗ 1 ( 1 , k )
DP 式为 a ∗ 1 ( 1 , 1 ) = 1 a ∗ 1 ( 1 , 1 ) = 1 ,a ∗ 1 ( 1 , k ) = k − 1 ∑ i = 1 a ∗ 1 ( 1 , i ) a 21 ( i , k ) ( k − 2 i − 1 ) a ∗ 1 ( 1 , k ) = ∑ i = 1 k − 1 a ∗ 1 ( 1 , i ) a 21 ( i , k ) ( k − 2 i − 1 ) 。
观察到给左右两边的 a ∗ 1 a ∗ 1 同乘阶乘会使形式简化许多。设 a ∗ 1 ( 1 , k ) = ( k − 1 ) ! x k − 1 , x 0 = 1 a ∗ 1 ( 1 , k ) = ( k − 1 ) ! x k − 1 , x 0 = 1 ,则有:
( k − 1 ) ! x k − 1 = k − 1 ∑ i = 1 ( i − 1 ) ! x i − 1 a 21 ( i , k ) ( k − 2 ) ! ( i − 1 ) ! ( k − i − 1 ) ! ( k − 1 ) ! x k − 1 = ∑ i = 1 k − 1 ( i − 1 ) ! x i − 1 a 21 ( i , k ) ( k − 2 ) ! ( i − 1 ) ! ( k − i − 1 ) !
( k − 1 ) x k − 1 = k − 1 ∑ i = 1 x i − 1 a 21 ( i , k ) 1 ( k − i − 1 ) ! ( k − 1 ) x k − 1 = ∑ i = 1 k − 1 x i − 1 a 21 ( i , k ) 1 ( k − i − 1 ) !
k x k = k ∑ i = 1 x i − 1 a 21 ( i , k + 1 ) 1 ( k − i ) ! k x k = ∑ i = 1 k x i − 1 a 21 ( i , k + 1 ) 1 ( k − i ) !
k x k = k − 1 ∑ i = 0 x i a 21 ( i + 1 , k + 1 ) ( k − i − 1 ) ! k x k = ∑ i = 0 k − 1 x i a 21 ( i + 1 , k + 1 ) ( k − i − 1 ) !
这个形式很好看,但是 a 21 ( i + 1 , k + 1 ) a 21 ( i + 1 , k + 1 ) 有两个变量而难以处理。
注意到限制只在前 m m 位处,故对于 l > m l > m 的状态,其 DP 值只与长度 r − l + 1 r − l + 1 有关。设 b ? ? ( k ) = a ? ? ( m + 1 , m + k ) b ? ? ( k ) = a ? ? ( m + 1 , m + k ) 。上式就可以改写为:
k x k = k − 1 ∑ i = 0 x i b 21 ( k − i + 1 ) ( k − i − 1 ) ! + min ( k − 1 , m − 1 ) ∑ i = 0 x i a 21 ( i + 1 , k + 1 ) − b 21 ( k − i + 1 ) ( k − i − 1 ) ! k x k = ∑ i = 0 k − 1 x i b 21 ( k − i + 1 ) ( k − i − 1 ) ! + ∑ i = 0 min ( k − 1 , m − 1 ) x i a 21 ( i + 1 , k + 1 ) − b 21 ( k − i + 1 ) ( k − i − 1 ) !
记 u i = b 21 ( i + 2 ) i ! u i = b 21 ( i + 2 ) i ! ,v k − 1 = min ( k − 1 , m − 1 ) ∑ i = 0 x i a 21 ( i + 1 , k + 1 ) − b 21 ( k − i + 1 ) ( k − i − 1 ) ! v k − 1 = ∑ i = 0 min ( k − 1 , m − 1 ) x i a 21 ( i + 1 , k + 1 ) − b 21 ( k − i + 1 ) ( k − i − 1 ) ! 。则:
k x k = v k − 1 + k − 1 ∑ i = 0 x i u k − i − 1 k x k = v k − 1 + ∑ i = 0 k − 1 x i u k − i − 1
写成生成函数就是 X ′ = V + U X X ′ = V + U X ,解这个微分方程得到 X = exp ( ∫ U ) [ 1 + ∫ ( V exp ( − ∫ U ) ) ] X = exp ( ∫ U ) [ 1 + ∫ ( V exp ( − ∫ U ) ) ] 。
注意到 b 21 ( k ) = 2 k − 2 + [ k = 1 ] b 21 ( k ) = 2 k − 2 + [ k = 1 ] ,对所有 l ∈ [ 1 , m + 1 ] l ∈ [ 1 , m + 1 ] ,r ∈ ( l , n ] r ∈ ( l , n ] 暴力 DP 出 a 21 ( l , r ) a 21 ( l , r ) 即可得到 b 21 ( k ) b 21 ( k ) ,再对所有 t ∈ [ 1 , m ] t ∈ [ 1 , m ] 暴力 DP 得到 x t x t ,即可计算 U U 与 V V 。
Part 2:a 1 ∗ ( k , n ) a 1 ∗ ( k , n )
注意到 k > m k > m 时 a 1 ∗ ( k , n ) = b 1 ∗ ( n − k + 1 ) a 1 ∗ ( k , n ) = b 1 ∗ ( n − k + 1 ) ,考虑先求出 b 1 ∗ ( k ) b 1 ∗ ( k ) ,求出后可对 k ∈ [ 1 , m ] k ∈ [ 1 , m ] 暴力 DP 出 a 1 ∗ ( k , n ) a 1 ∗ ( k , n ) 。
DP 式为 a 1 ∗ ( n , n ) = 1 , a 1 ∗ ( k , n ) = n ∑ i = k + 1 a 12 ( k , i ) a 1 ∗ ( i , n ) ( n − k − 1 i − k − 1 ) a 1 ∗ ( n , n ) = 1 , a 1 ∗ ( k , n ) = ∑ i = k + 1 n a 12 ( k , i ) a 1 ∗ ( i , n ) ( n − k − 1 i − k − 1 ) ,即:
b 1 ∗ ( k ) = k ∑ i = 2 b 12 ( i ) b 1 ∗ ( k − i + 1 ) ( k − 2 i − 2 ) = k − 1 ∑ i = 1 b 1 ∗ ( i ) b 12 ( k − i + 1 ) ( k − 2 i − 1 ) b 1 ∗ ( k ) = ∑ i = 2 k b 12 ( i ) b 1 ∗ ( k − i + 1 ) ( k − 2 i − 2 ) = ∑ i = 1 k − 1 b 1 ∗ ( i ) b 12 ( k − i + 1 ) ( k − 2 i − 1 )
令 b 1 ∗ ( k ) = ( k − 1 ) ! y k − 1 b 1 ∗ ( k ) = ( k − 1 ) ! y k − 1 ,代入:
( k − 1 ) ! y k − 1 = k − 1 ∑ i = 1 ( i − 1 ) ! y i − 1 b 12 ( k − i + 1 ) ( k − 2 ) ! ( i − 1 ) ! ( k − i − 1 ) ! ( k − 1 ) ! y k − 1 = ∑ i = 1 k − 1 ( i − 1 ) ! y i − 1 b 12 ( k − i + 1 ) ( k − 2 ) ! ( i − 1 ) ! ( k − i − 1 ) !
( k − 1 ) y k − 1 = k − 1 ∑ i = 1 y i − 1 b 12 ( k − i + 1 ) ( k − i − 1 ) ! ( k − 1 ) y k − 1 = ∑ i = 1 k − 1 y i − 1 b 12 ( k − i + 1 ) ( k − i − 1 ) !
k y k = k ∑ i = 1 y i − 1 b 12 ( k − i + 2 ) ( k − i ) ! k y k = ∑ i = 1 k y i − 1 b 12 ( k − i + 2 ) ( k − i ) !
k y k = k − 1 ∑ i = 0 y i b 12 ( k − i + 1 ) ( k − i − 1 ) ! = k − 1 ∑ i = 0 y i u k − i − 1 k y k = ∑ i = 0 k − 1 y i b 12 ( k − i + 1 ) ( k − i − 1 ) ! = ∑ i = 0 k − 1 y i u k − i − 1
于是有 Y ′ = U Y Y ′ = U Y ,解得 Y = exp ( ∫ U ) Y = exp ( ∫ U ) 。
总时间复杂度 O ( n ( log n + m ) ) O ( n ( log n + m ) ) 。
CF1616H Keep XOR Low (3000)
小于等于不好算,改为小于 x + 1 x + 1 。首先处理出 x x 的最高位,显然不能选两个高位不同的 a i a i ,故将所有 a i a i 按高位分类。
对所有 a i a i 建出字典树,设 s i z u s i z u 表示 u u 节点子树内的 a i a i 个数。下面设 u 1 = l s ( u ) u 1 = l s ( u ) ,u 2 = r s ( u ) u 2 = r s ( u ) 。
考虑递推,设 f u , v f u , v 表示 选出 u u 子树内一些数(不能不选)并选出 v v 子树内一些数(不能不选)组成的合法答案数量,则:
f u , v = f u 1 , v 1 + f u 2 , v 2 , x d e p u = 0 f u , v = f u 1 , v 1 + f u 2 , v 2 , x d e p u = 0
f u , v = f u 1 , v 2 f u 2 , v 1 + f u 2 , v 1 ( 2 s i z u 1 + 2 s i z v 2 − 1 ) + f u 1 , v 2 ( 2 s i z u 2 + 2 s i z u 1 − 1 ) + ( 2 s i z u 1 − 1 ) ( 2 s i z v 1 − 1 ) + ( 2 s i z u 2 − 1 ) ( 2 s i z v 2 − 1 ) , x d e p u = 1 f u , v = f u 1 , v 2 f u 2 , v 1 + f u 2 , v 1 ( 2 s i z u 1 + 2 s i z v 2 − 1 ) + f u 1 , v 2 ( 2 s i z u 2 + 2 s i z u 1 − 1 ) + ( 2 s i z u 1 − 1 ) ( 2 s i z v 1 − 1 ) + ( 2 s i z u 2 − 1 ) ( 2 s i z v 2 − 1 ) , x d e p u = 1
容易发现一个 u u 对应的 v v 是唯一的,故状态数量与节点数量同阶。
时间复杂度 O ( n log a i ) O ( n log a i ) 。
CF1119H Triple (3200)
鸽了好久没写,已经被问过3遍了
[ x S ] n ∏ t = 1 ( k ∑ i = 1 p i x a t , i ) [ x S ] ∏ t = 1 n ( ∑ i = 1 k p i x a t , i )
暴力即对每一层做 FWT,再点积起来做 IFWT。
考虑到只有 k k 种值,故 IFWT 后也只有 2 k 2 k 种值。只要算出每个位置上每种值的层数,就能得到答案。
下面定义一种新变换 ⊗ ⊗ ,S S 到 T T 的贡献系数为 S ⊗ T = | S ∩ T | mod 2 S ⊗ T = | S ∩ T | mod 2 。
设 f m a s k , S f m a s k , S 表示 S S 中的元素恰好贡献到 m a s k m a s k 的层数,即:
∀ i ∈ S , a t , i ⊗ m a s k = 1 ∀ i ∈ S , a t , i ⊗ m a s k = 1
∀ i ∉ S , a t , i ⊗ m a s k = 0 ∀ i ∉ S , a t , i ⊗ m a s k = 0
再设 g m a s k , S g m a s k , S 表示满足 ( ⊕ i ∈ S a t , i ) ⊗ m a s k = 1 ( ⊕ i ∈ S a t , i ) ⊗ m a s k = 1 的层数。容易通过 FWT 得到,该部分复杂度 O ( m 2 m + k ) O ( m 2 m + k ) 。
考虑 g S g S 会被哪些 f T f T 统计到。由 ( ⊕ i ∈ S a t , i ) ⊗ m a s k = 1 ( ⊕ i ∈ S a t , i ) ⊗ m a s k = 1 :
[ ( ⊕ i ∈ S ∩ T a t , i ) ⊗ m a s k ] ⊕ [ ( ⊕ i ∈ S ∖ T a t , i ) ⊗ m a s k ] = 1 [ ( ⊕ i ∈ S ∩ T a t , i ) ⊗ m a s k ] ⊕ [ ( ⊕ i ∈ S ∖ T a t , i ) ⊗ m a s k ] = 1
( ⊕ i ∈ S ∩ T a t , i ) ⊗ m a s k = 1 ( ⊕ i ∈ S ∩ T a t , i ) ⊗ m a s k = 1
| S ∩ T | mod 2 = 1 | S ∩ T | mod 2 = 1
S ⊗ T = 1 S ⊗ T = 1
故对 F F 作 ⊗ ⊗ 变换即得到 G G ,对 G G 作 ⊗ ⊗ 逆变换即得到 F F 。该部分复杂度 O ( k 2 m + k ) O ( k 2 m + k ) 。
容易发现 ⊗ ⊗ 变换与 FWTxor 变换是线性关系,故将 ⊗ ⊗ 变换替换为 FWTxor 变换是等价的。
总时间复杂度 O ( n 2 k + ( m + k ) 2 m + k ) O ( n 2 k + ( m + k ) 2 m + k ) 。
PTZ Camp2022 B6 Gachapon | PR#3 抽卡
直接 DP。考虑计算 t t 的答案,设 f i , j f i , j 表示 i i 级合法抽卡抽出的卡等级不超过 j j 的概率,g i , j g i , j 表示 i i 级合法抽卡抽出的卡等级不超过 j j 的情况中抽到 t t 的期望次数。
转移期望时,由于每个子树相同,可以只计算一个子树的贡献,再乘上 b i b i 。
f i , j ← f b i i − 1 , j − f b i i − 1 , i − 1 f i , j ← f i − 1 , j b i − f i − 1 , i − 1 b i
g i , j ← b i ( g i − 1 , j f b i − 1 i − 1 , j − g i − 1 , i − 1 f b i − 1 i − 1 , i − 1 ) g i , j ← b i ( g i − 1 , j f i − 1 , j b i − 1 − g i − 1 , i − 1 f i − 1 , i − 1 b i − 1 )
答案即为 g n , m g n , m 。
枚举 t t ,时间复杂度 O ( n m 2 log b ) O ( n m 2 log b ) 。
注意到对于不同的 t t ,答案状态是相同的。且计算出 f f 后 g g 的转移是线性的。直接将 g n , m g n , m 设为 1 1 ,倒推即可。
时间复杂度 O ( n m log b ) O ( n m log b ) 。
技巧:动态规划倒推 。将转移视为带权边,则产生一张 DAG。定义路径的权为其中所有边权之积。
设初始状态为 S S ,终止状态为 T T 。将 S S 的 DP 值设为 1 1 ,则 T T 的 DP 值可视为 S S 到 T T 的所有路径权值和。
故将所有边反向,权值不变 ,将 T T 的 DP 值设为 1 1 ,倒着转移可在 S S 处得到原先终止状态的 DP 值。
P7519 [省选联考 2021 A/B 卷] 滚榜
显然对每种最终排列计算其对应的最少过题数量 ,与 m m 比较即可判断是否合法。
设排列为 p 1 , p 2 , ⋯ , p n p 1 , p 2 , ⋯ , p n ,定义 p 0 p 0 为 a i a i 最大的中最靠前的 i i 。设 b i b i 表示在合法前提下 p i p i 的最少过题数量,则有:
b i = b i − 1 , a p i > a p i − 1 b i = b i − 1 , a p i > a p i − 1
b i = b i − 1 + a p i − 1 − a p i + [ p i − 1 < p i ] , a p i ≤ a p i − 1 b i = b i − 1 + a p i − 1 − a p i + [ p i − 1 < p i ] , a p i ≤ a p i − 1
注意到 { b i } { b i } 单调不降,且每次增量与 b i − 1 b i − 1 无关。于是在每次加入 p i p i 时直接预先给后面所有的 b i b i 加上增量 ,就不必再记录上一个 b i b i 的值。
考虑状压 DP,从前到后填 { p i } { p i } 。设 f S , i , j f S , i , j 表示已经填了 S S 里的数,最后一个填的数为 i i ,目前 b i b i 的和为 j j 的方案数,直接转移即可。
时间复杂度 O ( n 2 m 2 n ) O ( n 2 m 2 n ) ,空间复杂度 O ( n m 2 n ) O ( n m 2 n ) 。
PTZ Summer 2021 Day 1 G Generate the Sequences
理解一下题意立即发现题目等价于:
有一变量 x = 0 x = 0 ,每次可以令 x ← x + m − 2 x ← x + m − 2 (1 1 种方案),x ← x x ← x (1 1 种方案) 或 x ← x − 1 x ← x − 1 (x x 种方案)。求操作 n n 次方案数。
然而 x x 的值难以维护,至少要记录 1 , 3 1 , 3 操作的次数,只能做到 O ( n 3 ) O ( n 3 ) 。
注意到 1 , 3 1 , 3 操作与 2 2 操作是几乎独立的,可以分开考虑,按 1 , 3 1 , 3 操作 DP 再统计 2 2 操作的方案数。
考虑类似 ARC112E Cigar Box ,对于每次 2 2 操作不立刻进行,而是将其操作的时间延后。于是每次只需考虑在之后的操作中选出一些做 2 2 操作。
设 f k f k 表示剩下 k k 次操作,已经进行的操作的方案数。考虑下一次是 1 1 操作还是 3 3 操作,则:
f k − 1 ← f k f k − 1 ← f k
f k − i − 1 ← ( k − 1 i ) ( m − 2 i ) f k f k − i − 1 ← ( k − 1 i ) ( m − 2 i ) f k
时间复杂度 O ( n 2 ) O ( n 2 ) ,显然可以用分治 FFT 优化至 O ( n log 2 n ) O ( n log 2 n ) 。
PTZ Summer 2021 Day 1 M Multiple Parentheses
设 C ( x ) C ( x ) 表示卡特兰数的生成函数,则答案为:
[ x m ] [ C ( x ) − c k x k ] n [ x m ] [ C ( x ) − c k x k ] n
常数很小的多项式快速幂能过吗
拆开(或容斥)后只需快速计算 S ( n , k ) = [ x n ] C k ( x ) S ( n , k ) = [ x n ] C k ( x ) 即可。
结论:
[ x n ] C k ( x ) = ( k − 1 + 2 n n ) − ( k − 1 + 2 n n − 1 ) = k k + n ( k − 1 + 2 n n ) [ x n ] C k ( x ) = ( k − 1 + 2 n n ) − ( k − 1 + 2 n n − 1 ) = k k + n ( k − 1 + 2 n n )
组合证明:相当于 k k 个合法括号拼起来。尝试建立其与由 ( 0 , k − 1 ) ( 0 , k − 1 ) 走到 ( 2 n + k − 1 , 0 ) ( 2 n + k − 1 , 0 ) 的 Dyck Dyck 路径的双射:
括号序列组 → → 路径:依此按照每个括号序列行走,在走完每个括号序列后额外向右下走一步。
路径 → → 括号序列组:取所有前缀 min 作为断点将整条路径分为 n n 条路径,从而对应括号序列组。
时间复杂度 O ( n + m ) O ( n + m ) 。
PTZ Winter 2021 Day 8 G Biological Software Utilities
不会组合做法
考虑如何判断一棵树是否为二分图。可以类似拓扑排序不断删掉叶子,看是否能删空。
具体而言,设 d p u d p u 表示 u u 是否与子树内的匹配。则:
d p u = { 1 , 子 树 内 全 为 0 0 , 子 树 内 恰 有 一 个 1 d p u = { 1 , 子 树 内 全 为 0 0 , 子 树 内 恰 有 一 个 1
若子树内有多个 1 1 则整棵树不合法。
上生成函数。设 F ( x ) , G ( x ) F ( x ) , G ( x ) 分别表示根的 DP 值为 0 , 1 0 , 1 的有标号有根树 的指数型生成函数。则:
F ( x ) = x G ( x ) exp F ( x ) F ( x ) = x G ( x ) exp F ( x )
G ( x ) = x exp F ( x ) G ( x ) = x exp F ( x )
于是 F ( x ) = G ( x ) 2 F ( x ) = G ( x ) 2 ,代入得:
√ F ( x ) = x exp F ( x ) F ( x ) = x exp F ( x )
ln F ( x ) x 2 = 2 F ( x ) ln F ( x ) x 2 = 2 F ( x )
注意 F ( x ) F ( x ) 只在偶数项有值,令 F ( x ) = P ( x 2 ) F ( x ) = P ( x 2 ) ,则:
ln P ( x 2 ) x 2 = 2 P ( x 2 ) ln P ( x 2 ) x 2 = 2 P ( x 2 )
ln P ( x ) x = 2 P ( x ) ln P ( x ) x = 2 P ( x )
设 Q ( x ) Q ( x ) 为 P ( x ) P ( x ) 的复合逆。
ln x Q ( x ) = 2 x ln x Q ( x ) = 2 x
x Q ( x ) = e 2 x x Q ( x ) = e 2 x
由拉格朗日反演:
P ( x ) = 1 n [ x n − 1 ] ( x Q ( x ) ) n = 1 n [ x n − 1 ] e 2 n x = ( 2 n ) n − 1 n ! P ( x ) = 1 n [ x n − 1 ] ( x Q ( x ) ) n = 1 n [ x n − 1 ] e 2 n x = ( 2 n ) n − 1 n !
故 f n = n n / 2 − 1 ( n / 2 ) ! ( 2 ∣ n ) f n = n n / 2 − 1 ( n / 2 ) ! ( 2 ∣ n ) 。
答案即为:
A n s = ⎧ ⎪ ⎨ ⎪ ⎩ 0 , 2 ∤ n ( n − 1 ) ! n n / 2 − 1 ( n / 2 ) ! , 2 ∣ n A n s = { 0 , 2 ∤ n ( n − 1 ) ! n n / 2 − 1 ( n / 2 ) ! , 2 ∣ n
总时间复杂度 O ( n ) O ( n ) 。
LOJ6495 「雅礼集训 2018 Day1」树
为什么网上全是 n^4 | 为啥不出 n=1000
假装没有第一问,不考虑精度问题。
从上往下 DP,设 f i , j f i , j 表示子树大小为 i i ,深度为 j j 的方案数。考虑根的最前面的儿子,转移即:
f i + j , max ( p , q + 1 ) ← ( i + j − 2 i − 1 ) f i , p f j , q f i + j , max ( p , q + 1 ) ← ( i + j − 2 i − 1 ) f i , p f j , q
枚举 i + j i + j 分层转移,朴素转移 O ( n 4 ) O ( n 4 ) 。
注意到第二维相当于 max max 卷积,前缀和/差分优化即可做到 O ( n 3 ) O ( n 3 ) 。
注意到第一维相当于多项式卷积,再上个 NTT 即可做到 O ( n 2 log n ) O ( n 2 log n ) 。
LOJ3120 [CTS2019] 珍珠
记 c = min ( d , n − 2 m ) c = min ( d , n − 2 m ) ,相当于要求出现奇数次的颜色不超过 c c 种。
A n s = [ x n ] c ∑ i = 0 ( d i ) ( e x − e − x 2 ) i ( e x + e − x 2 ) d − i = 2 − d [ x n ] e − d c ∑ i = 0 ( d i ) ( e 2 x − 1 ) i ( e 2 x + 1 ) d − i A n s = [ x n ] ∑ i = 0 c ( d i ) ( e x − e − x 2 ) i ( e x + e − x 2 ) d − i = 2 − d [ x n ] e − d ∑ i = 0 c ( d i ) ( e 2 x − 1 ) i ( e 2 x + 1 ) d − i
记 F ( x ) = c ∑ i = 0 ( d i ) ( x − 1 ) i ( x + 1 ) d − i F ( x ) = ∑ i = 0 c ( d i ) ( x − 1 ) i ( x + 1 ) d − i ,则 A n s = 2 − d d ∑ i = 0 ( 2 i − d ) n A n s = 2 − d ∑ i = 0 d ( 2 i − d ) n 。下面考虑计算 F ( x ) F ( x ) 。
F ( x ) F ( x ) 是 D-finite 的,考虑对其求导:
F ′ ( x ) = c ∑ i = 0 ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i + c ∑ i = 0 ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1 F ′ ( x ) = ∑ i = 0 c ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i + ∑ i = 0 c ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1
d F ( x ) = c ∑ i = 0 ( d i ) i ( x − 1 ) i ( x + 1 ) d − i + c ∑ i = 0 ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i = ( x − 1 ) c ∑ i = 0 ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i + ( x + 1 ) c ∑ i = 0 ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1 = x F ′ ( x ) + c ∑ i = 0 ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − c ∑ i = 0 ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i = x F ′ ( x ) + c ∑ i = 0 ( d i ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( d − i ) ( x − 1 ) − i ( x + 1 ) ] = x F ′ ( x ) + c ∑ i = 0 ( d i ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ d ( x − 1 ) − 2 i x ] = x F ′ ( x ) + d c ∑ i = 0 ( d i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − 2 d x c ∑ i = 0 ( d − 1 i − 1 ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 = x F ′ ( x ) + d { c ∑ i = 0 ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( x − 1 ) ( d i ) − 2 x ( d − 1 i − 1 ) ] } = x F ′ ( x ) + d { c ∑ i = 0 ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( x − 1 ) ( d − 1 i ) − ( x + 1 ) ( d − 1 i − 1 ) ] } = x F ′ ( x ) + d { c ∑ i = 0 ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − c ∑ i = 0 ( d − 1 i − 1 ) ( x − 1 ) i − 1 ( x + 1 ) d − i } = x F ′ ( x ) + d { c ∑ i = 0 ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − c − 1 ∑ i = 0 ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 } = x F ′ ( x ) + d ( d − 1 c ) ( x − 1 ) c ( x + 1 ) d − c − 1 d F ( x ) = ∑ i = 0 c ( d i ) i ( x − 1 ) i ( x + 1 ) d − i + ∑ i = 0 c ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i = ( x − 1 ) ∑ i = 0 c ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i + ( x + 1 ) ∑ i = 0 c ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1 = x F ′ ( x ) + ∑ i = 0 c ( d i ) ( d − i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − ∑ i = 0 c ( d i ) i ( x − 1 ) i − 1 ( x + 1 ) d − i = x F ′ ( x ) + ∑ i = 0 c ( d i ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( d − i ) ( x − 1 ) − i ( x + 1 ) ] = x F ′ ( x ) + ∑ i = 0 c ( d i ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ d ( x − 1 ) − 2 i x ] = x F ′ ( x ) + d ∑ i = 0 c ( d i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − 2 d x ∑ i = 0 c ( d − 1 i − 1 ) ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 = x F ′ ( x ) + d { ∑ i = 0 c ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( x − 1 ) ( d i ) − 2 x ( d − 1 i − 1 ) ] } = x F ′ ( x ) + d { ∑ i = 0 c ( x − 1 ) i − 1 ( x + 1 ) d − i − 1 [ ( x − 1 ) ( d − 1 i ) − ( x + 1 ) ( d − 1 i − 1 ) ] } = x F ′ ( x ) + d { ∑ i = 0 c ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − ∑ i = 0 c ( d − 1 i − 1 ) ( x − 1 ) i − 1 ( x + 1 ) d − i } = x F ′ ( x ) + d { ∑ i = 0 c ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 − ∑ i = 0 c − 1 ( d − 1 i ) ( x − 1 ) i ( x + 1 ) d − i − 1 } = x F ′ ( x ) + d ( d − 1 c ) ( x − 1 ) c ( x + 1 ) d − c − 1
即 ( d − ϑ ) F ( x ) = d ( d − 1 c ) ( x − 1 ) c ( x + 1 ) d − c − 1 ( d − ϑ ) F ( x ) = d ( d − 1 c ) ( x − 1 ) c ( x + 1 ) d − c − 1 。设 a = c , b = d − c − 1 a = c , b = d − c − 1 ,只需快速计算 G ( x ) = ( x − 1 ) a ( x + 1 ) b G ( x ) = ( x − 1 ) a ( x + 1 ) b 即可。
G ( x ) G ( x ) 也是 D-finite 的,对其求导:
G ′ ( x ) = a ( x − 1 ) a − 1 ( x + 1 ) b + b ( x − 1 ) a ( x + 1 ) b − 1 = G ( x ) ( a x + 1 + b x − 1 ) G ′ ( x ) = a ( x − 1 ) a − 1 ( x + 1 ) b + b ( x − 1 ) a ( x + 1 ) b − 1 = G ( x ) ( a x + 1 + b x − 1 )
( x 2 − 1 ) G ′ ( x ) = [ ( a + b ) x + ( a − b ) ] G ( x ) ( x 2 − 1 ) G ′ ( x ) = [ ( a + b ) x + ( a − b ) ] G ( x )
− ( i + 1 ) g i + 1 = ( a − b ) g i + ( a + b − i + 1 ) g i − 1 − ( i + 1 ) g i + 1 = ( a − b ) g i + ( a + b − i + 1 ) g i − 1
于是可以线性递推。
计算答案时,求 i n i n 可以线性筛,复杂度 O ( d log n ln d ) = O ( d log d n ) O ( d log n ln d ) = O ( d log d n ) 。
总时间复杂度 O ( d log d n ) O ( d log d n ) 。
LOJ2554「CTSC2018」青蕈领主
显然若将每个 i i 对应的区间 [ i − a i + 1 , i ] [ i − a i + 1 , i ] 画出,这些区间一定形成树的结构,否则不合法。
具体而言,区间 [ i − a i + 1 , i − 1 ] [ i − a i + 1 , i − 1 ] 一定能被分成若干极长连续的子区间(即儿子)。可以将每个子区间看成一个数,故设子区间个数为 s o n u s o n u ,只需要求出形如 1 1 ... 1 n+1
问题的答案 f n f n ,答案即为 ∏ u f s o n u ∏ u f s o n u 。
利用递归的结构,设 G ( x ) = + ∞ ∑ i = 1 i ! x i G ( x ) = ∑ i = 1 + ∞ i ! x i ,则有:
G ( x ) = x F ( G ( x ) ) + x G ( x ) = x F ( G ( x ) ) + x
F ( G ( x ) ) + 1 = G ( x ) x F ( G ( x ) ) + 1 = G ( x ) x
设 R ( x ) R ( x ) 为 G ( x ) G ( x ) 的复合逆,代入 R ( x ) R ( x ) 可得:
F ( x ) = x R ( x ) − 1 F ( x ) = x R ( x ) − 1
接下来只需要求 R ( x ) R ( x ) 即可。注意到 G ( x ) G ( x ) 是 D-finite 的,可知 ( x − 1 ) G ( x ) + x 2 G ′ ( x ) + x = 0 ( x − 1 ) G ( x ) + x 2 G ′ ( x ) + x = 0 ,代入 R ( x ) R ( x ) 得:
x ( R ( x ) − 1 ) + R ( x ) 2 G ′ ( R ( x ) ) + R ( x ) = 0 x ( R ( x ) − 1 ) + R ( x ) 2 G ′ ( R ( x ) ) + R ( x ) = 0
由 1 = G ( R ( x ) ) ′ = R ′ ( x ) G ′ ( R ( x ) ) 1 = G ( R ( x ) ) ′ = R ′ ( x ) G ′ ( R ( x ) ) ,
x ( R ( x ) − 1 ) + R ( x ) 2 R ′ ( x ) + R ( x ) = 0 x ( R ( x ) − 1 ) + R ( x ) 2 R ′ ( x ) + R ( x ) = 0
x R ( x ) R ′ ( x ) − x R ′ ( x ) + R ( x ) 2 + R ( x ) R ′ ( x ) = 0 x R ( x ) R ′ ( x ) − x R ′ ( x ) + R ( x ) 2 + R ( x ) R ′ ( x ) = 0
n − 1 ∑ i = 1 i r i r n − i + n − 1 ∑ i = 1 r i r n − i + n ∑ i = 1 i r i r n + 1 − i = n r n ∑ i = 1 n − 1 i r i r n − i + ∑ i = 1 n − 1 r i r n − i + ∑ i = 1 n i r i r n + 1 − i = n r n
− r n = n − 1 ∑ i = 1 ( i + 1 ) r i r n − i + n − 1 ∑ i = 2 i r i r n + 1 − i − r n = ∑ i = 1 n − 1 ( i + 1 ) r i r n − i + ∑ i = 2 n − 1 i r i r n + 1 − i
分治 FFT 即可。时间复杂度 O ( n log 2 n ) O ( n log 2 n ) 。
LOJ3726「SDOI / SXOI2022」多边形
对一条边考虑,关注边上的顶点(不含两端)。由于允许这些点不连边,先枚举哪些点连边。
凸 n n 边形的三角剖分有 C a t a l a n ( n − 2 ) C a t a l a n ( n − 2 ) 种,但如果存在原本在同一条边的两个点连边就会不合法。
考虑容斥。记恰跨过一个(选中的)点的边为 关键边,注意到不合法的方案至少包含一条关键边,且不同的关键边方案对应的一定是不同的方案,故可以按关键边数量容斥。
设这条边上有 a a 个顶点(不含两端),f i f i 表示剩下 i i 个顶点(不含两端)的方案数。枚举选中了 k k 个点,插板可得:
f i = a ∑ k = i ( − 1 ) k − i ( a k ) ( i + 1 k − i ) f i = ∑ k = i a ( − 1 ) k − i ( a k ) ( i + 1 k − i )
最后只需要将所有 F a ( x ) F a ( x ) 乘起来再乘上对应的卡特兰数统计答案即可。接下来考虑如何快速计算 F a ( x ) F a ( x ) 。
f i = [ x a − i ] a ∑ k = i ( a k ) x a − k ( i + 1 k − i ) ( − x ) k − i f i = [ x a − i ] ∑ k = i a ( a k ) x a − k ( i + 1 k − i ) ( − x ) k − i
f i = [ x a − i ] ( 1 + x ) a ( 1 − x ) i + 1 f i = [ x a − i ] ( 1 + x ) a ( 1 − x ) i + 1
记 G k ( x ) = ( 1 + x ) a ( 1 − x ) k G k ( x ) = ( 1 + x ) a ( 1 − x ) k 。注意到 G k ( x ) G k ( x ) 是 D-finite 的,对其求导:
G ′ k ( x ) = G k ( x ) ( a 1 + x − k 1 − x ) G k ′ ( x ) = G k ( x ) ( a 1 + x − k 1 − x )
( 1 − x 2 ) G ′ k ( x ) = a ( 1 − x ) G k ( x ) − k ( 1 + x ) G k ( x ) = ( a − k ) G k ( x ) − ( a + k ) x G k ( x ) ( 1 − x 2 ) G k ′ ( x ) = a ( 1 − x ) G k ( x ) − k ( 1 + x ) G k ( x ) = ( a − k ) G k ( x ) − ( a + k ) x G k ( x )
( i + 1 ) g i + 1 = ( a − k ) g i − ( k + a − i + 1 ) g i − 1 ( i + 1 ) g i + 1 = ( a − k ) g i − ( k + a − i + 1 ) g i − 1
于是记录相邻两项系数,可以 O ( 1 ) O ( 1 ) 推出前后项。
同时有 G k + 1 ( x ) = ( 1 − x ) G k ( x ) G k + 1 ( x ) = ( 1 − x ) G k ( x ) ,故可以推出 G k ( x ) G k ( x ) 的三项,再推出 G k + 1 ( x ) G k + 1 ( x ) 的两项。
类似莫队转移,可以 O ( a ) O ( a ) 计算出 F a ( x ) F a ( x ) 。该部分总时间复杂度 O ( ∑ a t ) O ( ∑ a t ) 。
总时间复杂度 O ( ∑ a t log 2 ∑ a t ) O ( ∑ a t log 2 ∑ a t ) 。
LOJ3397「2020-2021 集训队作业」春天,在积雪下结一成形,抽枝发芽
析合树的构成具有以下性质:
设有 i i 个叶子节点,根节点为析点的菊花形析合树的数量为 f i f i ,根节点为合点的数量的析合树数量为 2 g i 2 g i (即只统计单调上升),排列的生成函数为 H ( x ) H ( x ) (无常数项)。
由上述性质,对应到生成函数上即为:
G ( x ) = ∑ i ≥ 2 ( H ( x ) − G ( x ) ) i = 1 1 − H ( x ) + G ( x ) − 1 − H ( x ) + G ( x ) G ( x ) = ∑ i ≥ 2 ( H ( x ) − G ( x ) ) i = 1 1 − H ( x ) + G ( x ) − 1 − H ( x ) + G ( x )
F ( H ( x ) ) = H ( x ) − 2 G ( x ) − x F ( H ( x ) ) = H ( x ) − 2 G ( x ) − x
由第一条式子,
( 1 + H ( x ) ) ( 1 − H ( x ) + G ( x ) ) = 1 ( 1 + H ( x ) ) ( 1 − H ( x ) + G ( x ) ) = 1
G ( x ) = H 2 ( x ) 1 + H ( x ) G ( x ) = H 2 ( x ) 1 + H ( x )
设 R ( x ) R ( x ) 为 H ( x ) H ( x ) 的复合逆,代入得 G ( H ( x ) ) = x 2 1 + x G ( H ( x ) ) = x 2 1 + x 。再代入第二条式子:
F ( x ) = x − x 2 1 + x − R ( x ) F ( x ) = x − x 2 1 + x − R ( x )
于是只需计算 R ( x ) R ( x ) 即可。
同 LOJ2554「CTSC2018」青蕈领主 ,使用分治 NTT,时间复杂度 O ( n log 2 n ) O ( n log 2 n ) 。
CF1691F K-Set Tree (2500)
拆贡献,考虑在以 r r 为根时 x x 没有贡献当且仅当将 r r 到 u u 的链删掉后,所有选出的点都在剩下的一棵子树内。算出方案数后用总数减掉即为答案。
不换根。若枚举每个 x x 难以统计删链后的子树信息,直接考虑每棵子树的贡献。下面设 f a f a 为 u u 的父亲,有两种情况:
预处理每个点的子树大小 s i z u s i z u 及 f u f u 表示删掉 u u 后在剩下的某棵子树内选 k k 个点的方案数。则容易计算上述方案数,总时间复杂度 O ( n ) O ( n ) 。
CF1667E Centroid Probabilities (3000)
设点 k k 子树大小超过 ( n − 1 ) / 2 ( n − 1 ) / 2 的方案数为 f k f k 。由于重心是唯一的,故点 k k 为重心的方案数为 ( n − 1 ) ! − f k − n ∑ i = k + 1 1 i − 1 f i ( n − 1 ) ! − f k − ∑ i = k + 1 n 1 i − 1 f i 。只需要快速计算 f k f k 即可。
枚举 f k f k 的子树大小为 i i ,有:
f k = ( k − 1 ) ! n − k ∑ i = ( n + 1 ) / 2 ( n − k i − 1 ) ( i − 1 ) ! ( n − i − 1 ) ! ( k − 2 ) ! = ( n − k ) ! k − 2 n − k ∑ i = ( n + 1 ) / 2 ( n − i − 1 ) ! ( n − k − i + 1 ) ! f k = ( k − 1 ) ! ∑ i = ( n + 1 ) / 2 n − k ( n − k i − 1 ) ( i − 1 ) ! ( n − i − 1 ) ! ( k − 2 ) ! = ( n − k ) ! k − 2 ∑ i = ( n + 1 ) / 2 n − k ( n − i − 1 ) ! ( n − k − i + 1 ) !
f k = ( n − k ) ! k − 2 n − k ∑ i = ( n + 1 ) / 2 ( n − i − 1 ) k − 2 – ––– – f k = ( n − k ) ! k − 2 ∑ i = ( n + 1 ) / 2 n − k ( n − i − 1 ) k − 2 _
而后面这个东西就是有限积分(或叫整数裂项),可以这样算:
n ∑ i = k i k – – = 1 k ( n + 1 ) k – – ∑ i = k n i k _ = 1 k ( n + 1 ) k _
总时间复杂度 O ( n ) O ( n ) 。
CF1672G Cross Xor (3200)
首先肯定要分析能被操作到的矩阵的性质。
将所有合法矩阵写成 n m n m 维的向量,构成线性空间 M M 。
记在初始网格上操作 ( x , y ) ( x , y ) 后得到的向量为 P x , y P x , y ,显然 M M 中元素都可以由 { P x , y } { P x , y } 线性组合出,但仍难以分析。
考虑 M M 的正交补空间 M ⊥ M ⊥ 。注意到 P x 1 , y 1 ⊕ P x 1 , y 2 ⊕ P x 2 , y 1 ⊕ P x 2 , y 2 ∈ M P x 1 , y 1 ⊕ P x 1 , y 2 ⊕ P x 2 , y 1 ⊕ P x 2 , y 2 ∈ M ,其影响是只将 ( x 1 , y 1 ) , ( x 1 , y 2 ) , ( x 2 , y 1 ) , ( x 2 , y 2 ) ( x 1 , y 1 ) , ( x 1 , y 2 ) , ( x 2 , y 1 ) , ( x 2 , y 2 ) 反转,故若 u ∈ M ⊥ u ∈ M ⊥ ,则:
∀ x 1 , x 2 , y 1 , y 2 , u x 1 , y 1 ⊕ u x 1 , y 2 ⊕ u x 2 , y 1 ⊕ u x 2 , y 2 = 0 ∀ x 1 , x 2 , y 1 , y 2 , u x 1 , y 1 ⊕ u x 1 , y 2 ⊕ u x 2 , y 1 ⊕ u x 2 , y 2 = 0
也就是说,若固定两行 x 1 , x 2 x 1 , x 2 ,则 ∀ y 1 , y 2 , u x 1 , y 1 ⊕ u x 2 , y 1 = u x 1 , y 2 ⊕ u x 2 , y 2 ∀ y 1 , y 2 , u x 1 , y 1 ⊕ u x 2 , y 1 = u x 1 , y 2 ⊕ u x 2 , y 2 ,即存在常数 c c 使 u x 2 , y = u x 1 , y ⊕ c u x 2 , y = u x 1 , y ⊕ c 。进一步可知这等价于存在 n n 维向量 A A 及 m m 维向量 B B 使得 u x , y = A x ⊕ B y u x , y = A x ⊕ B y 。
考虑如何判断 ( A , B ) ( A , B ) 生成的 u u 是否合法。由于 M M 中元素都可以由 { P x , y } { P x , y } 线性组合出,只需要判断 u u 是否与所有 P x , y P x , y 垂直即可。即:
∀ x , y , u ⋅ P x , y = ( ⊕ A i ) ⊕ ( ⊕ B i ) ⊕ ( m − 1 ) A x ⊕ ( n − 1 ) B y = 0 ∀ x , y , u ⋅ P x , y = ( ⊕ A i ) ⊕ ( ⊕ B i ) ⊕ ( m − 1 ) A x ⊕ ( n − 1 ) B y = 0
显然与 n , m n , m 的奇偶性有关,分情况讨论:
n , m n , m 均为偶数:条件变为 A x ⊕ B y = ( ⊕ A i ) ⊕ ( ⊕ B i ) A x ⊕ B y = ( ⊕ A i ) ⊕ ( ⊕ B i ) 。
故 A x , B y A x , B y 都是常数且相等,生成的 u u 每一位都为 0 0 。
即所有方案合法。
n n 为偶数,m m 为奇数:条件变为 B y = ( ⊕ A i ) ⊕ ( ⊕ B i ) B y = ( ⊕ A i ) ⊕ ( ⊕ B i ) 。
故 B y B y 是常数且 ⊕ A i = 0 ⊕ A i = 0 。生成的 u u 每一行的元素都相同。考虑 v ∈ M v ∈ M ,若将 u u 中某全 1 1 行与某全 0 0 行互换,那么 v v 中这两行的异或和必须相同。进一步得到 v v 合法当且仅当每一行的异或和相同。
即每一行的异或和相同的方案合法。
n n 为奇数,m m 为偶数:每一列的异或和相同的方案合法。
n , m n , m 均为奇数:条件变为 ( ⊕ A i ) ⊕ ( ⊕ B i ) = 0 ( ⊕ A i ) ⊕ ( ⊕ B i ) = 0 。
同上面的分析,v v 合法当且仅当每一行每一列的异或和相同。
即每一行每一列的异或和相同的方案合法。
考虑计数。
n , m n , m 均为偶数:答案为 2 # ? 2 # ? 。
n n 为偶数,m m 为奇数:枚举每一行的异或和。若该行没有 ? ? 则异或和已经确定,否则若有 c c 个 ? ? 则方案数为 2 c − 1 2 c − 1 。
n , m n , m 均为奇数:先枚举每一行每一列的异或和。一个元素会影响到一行及一列,可以考虑将行列看作点,元素看作边建图。
先统计每一行每一列与目标状态的异或和作为权值。对于每一个联通块,若所有点权值异或和不为 0 0 则无解(连边不改变奇偶性),否则若有 V V 个点 E E 条边则方案数为 2 E − V + 1 2 E − V + 1 (这是因为随意求出一棵生成树并确定非树边情况后,树边情况是唯一的)。
时间复杂度 O ( n m ) O ( n m ) 。
UOJ683 【UR #22】月球车站
记 0 0 表示反面,1 1 表示正面,c x c x 表示状态 x x 的第一个硬币,t r x , 1 , t r x , 0 t r x , 1 , t r x , 0 分别表示 x x 选择是否反转的后继状态。则可以列出经典期望 DP:
f x = 1 + p f t r x , 1 + ( 1 − p ) f t r 0 , c x = 0 f x = 1 + p f t r x , 1 + ( 1 − p ) f t r 0 , c x = 0
f x = 1 + max { f t r x , 0 , f t r x , 1 } , c x = 1 f x = 1 + max { f t r x , 0 , f t r x , 1 } , c x = 1
这东西成环还带 max max ,不是很可做。
分析性质尝试把环和 max max 去掉。假设伏特采用最优策略使步数尽可能少,即 f x = 1 + min { f t r x , 0 , f t r x , 1 } , c x = 0 f x = 1 + min { f t r x , 0 , f t r x , 1 } , c x = 0 。
类似 Dijkstra 从终止状态倒推。设当前考虑状态 u u ,u u 能转移到的两个状态分别为 x , y x , y (其中 c x = 0 , c y = 1 c x = 0 , c y = 1 且它们除了第一个硬币外都相同)。
若 x x 是第一次被访问到,则可以直接转移(伏特希望步数尽可能少);若 y y 是第二次被访问到,那么只能转移(y y 第一次访问不会被转移,而每个点只会转移到两个状态,第二次转移即为较大的那个)。
又注意到 x x 和 y y 除了第一个硬币外都相同,它们被访问到的次数是相同的,故每次拓展恰有一个状态被转移。也即转移形成一条链 。
这里有一个不严谨之处:初始状态(即全为正面)无法作为第二次转移的 y y ,从而导致提前终止,某些状态没有被转移到。下面证明所有情况伏特都能使游戏在有限步内结束:
证明:称 n n 次操作为一回合。在每一回合内,伏特先始终翻转,如果 skip 蚤始终不翻转,这一回合后就会结束;否则,在 skip 蚤第一次翻转后伏特将策略改为始终不翻转,这样一回合后状态倒序的字典序都会严格减小,于是游戏能在有限次操作内结束。
回到原问题,先将所有状态按照链上顺序编号(f i f i 的编号也对应改变)。伏特每次操作会从 u u 跳到 u − 1 u − 1 或 x > u − 1 x > u − 1 ,skip 蚤每次操作会从 u u 跳到 u − 1 u − 1 或 x < u − 1 x < u − 1 。
环差不多已经去掉了,考虑去 max max ,有结论:f i f i 单调递增。
证明:若 x < y , f x > f y x < y , f x > f y ,skip 蚤从 y y 到 x x 过程中每次都从 u u 跳到 u − 1 u − 1 ,第一次到达 x x 后按 f x f x 最优策略走。这个策略的步数 f ′ y > f x > f y f y ′ > f x > f y ,与 f y f y 的最大性矛盾。
于是去掉了 max max 。现在转移形如 u → u − 1 u → u − 1 或 u → x , x > u − 1 u → x , x > u − 1 。同 P6835 [Cnoi2020]线形生物 ,将状态改为 u u 到 u − 1 u − 1 的期望步数即可线性解决。
p = 0 p = 0 或 p = 1 p = 1 时可能无解,需要特判。
时间复杂度 O ( 2 n ) O ( 2 n ) 。
CF1603F October 18, 2017 (2700)
《2700》
显然只关心 x x 是否为 0 0 ,因为若 x > 0 x > 0 可以通过变换基底化为同种情况。
先计算基底的数量。要求不能线性组合出 x x 的限制比较难处理,考虑用总数减去反面。
可以从整体考虑:一组基底共可以组合出 2 r − 1 2 r − 1 个非零向量,而所有 2 k − 1 2 k − 1 个非零向量出现的概率是均等的,故能组合出 x x 的基底数量即为:
2 r − 1 2 k − 1 r − 1 ∏ i = 0 ( 2 k − 2 i ) = ( 2 r − 1 ) r − 1 ∏ i = 1 ( 2 k − 2 i ) 2 r − 1 2 k − 1 ∏ i = 0 r − 1 ( 2 k − 2 i ) = ( 2 r − 1 ) ∏ i = 1 r − 1 ( 2 k − 2 i )
于是不能组合出 x x 的基底数量为:
r − 1 ∏ i = 0 ( 2 k − 2 i ) − ( 2 r − 1 ) r − 1 ∏ i = 1 ( 2 k − 2 i ) = ( 2 k − 2 r ) r − 1 ∏ i = 1 ( 2 k − 2 i ) = r ∏ i = 1 ( 2 k − 2 i ) ∏ i = 0 r − 1 ( 2 k − 2 i ) − ( 2 r − 1 ) ∏ i = 1 r − 1 ( 2 k − 2 i ) = ( 2 k − 2 r ) ∏ i = 1 r − 1 ( 2 k − 2 i ) = ∏ i = 1 r ( 2 k − 2 i )
还要计算剩下 n − r n − r 个元素的数量。同 ARC133F Many Xor Optimization Problems ,写出生成函数:
[ x n − r ] r ∏ i = 0 1 1 − 2 i x = ( n r ) 2 [ x n − r ] ∏ i = 0 r 1 1 − 2 i x = ( n r ) 2
于是答案即为:
A n s = n ∑ r = 0 ( n r ) 2 r ∏ i = 1 ( 2 k − 2 i ) A n s = ∑ r = 0 n ( n r ) 2 ∏ i = 1 r ( 2 k − 2 i )
预处理后即可 O ( min ( n , k ) ) O ( min ( n , k ) ) 计算。
P7213 [JOISC2020] 最古の遺跡 3
容易发现原过程等价于以下过程:
从大到小枚举每个 i i ,不断进行 :若存在 j > i j > i 使 a j = a i a j = a i 则令 a i ← a i − 1 a i ← a i − 1 。
那么也等价于以下过程:
维护一个桶 { b i } { b i } ,从后往前考虑每个 a i a i ,找到最大的数 x ≤ a i x ≤ a i 使得 b x = 0 b x = 0 ,如果 x > 0 x > 0 则令 b x = 1 b x = 1 。
先认为 2 n 2 n 个数互相区分,最后再除以 2 n 2 n 即可。将从后往前改为从前往后,本质不变。
考虑维护数组 { c i } { c i } ,c i c i 表示剩下的数中填入后会变成 i i 的数字数量。每次操作为以下两种之一:
选中一个 k > 0 k > 0 ,找到最大的 x ≤ k x ≤ k 使得 c x ≠ 0 c x ≠ 0 (如果找不到则 x = 0 x = 0 ),然后令 c x ← c x + c k − 1 , c k ← 0 c x ← c x + c k − 1 , c k ← 0 。(对应石柱最后变为 k k )
如果 c 0 > 0 c 0 > 0 ,可以令 c 0 ← c 0 − 1 c 0 ← c 0 − 1 。(对应石柱消失)
那么记 d p i , j d p i , j 表示填了 i i 个数,c 1 , ⋯ , c j = 0 c 1 , ⋯ , c j = 0 且 c j + 1 ≠ 0 c j + 1 ≠ 0 的方案数。
转移考虑:
k ≠ j + 1 k ≠ j + 1 时,算做一个无用步数,转移系数为 1 1 (可以用 i i 和 j j 可以算出 c 0 c 0 )。
k = j + 1 k = j + 1 时,枚举之前已经填好了 j + 2 ∼ t j + 2 ∼ t ,那么从前面的无用步数(设为 d d ,也可以用 i i 和 j j 算出)中取出 t − j − 1 t − j − 1 步用来填 j + 2 ∼ t j + 2 ∼ t (假设方案数是 p r e t − j − 1 p r e t − j − 1 ),那么可以得到转移系数为 ( d t − j − 1 ) p r e t − j − 1 ( t − j + 1 ) ( d t − j − 1 ) p r e t − j − 1 ( t − j + 1 ) 。
注意到 p r e i p r e i 相当于没有石柱消失的方案数,再做一次 DP 预处理出来即可。
总时间复杂度 O ( n 3 ) O ( n 3 ) 。
事实上转移式就是个卷积式,可以 NTT 优化到 O ( n 2 log n ) O ( n 2 log n ) 。
LOJ3394 「2020-2021 集训队作业」Tour
先考虑 a i ≥ 0 a i ≥ 0 的情况。考虑以下算法:
维护可重集 S = { a 1 , a 2 , ⋯ , a n } S = { a 1 , a 2 , ⋯ , a n } 与变量 s s 表示能放的位置数量。
不断执行以下操作:令 a n s ← a n s ⋅ s = 1 a n s ← a n s ⋅ s = 1 ,记 x , y x , y 分别为 S S 中最小值与最大值。
时间复杂度 O ( n ) O ( n ) 。
回到原题目,只需要考虑每个极长连续符号相同段。求出将自然数/负数填进 k k 段的方案数 f i / g i f i / g i ,答案即为 min ( n , m ) ∑ i = 0 ( 2 f i g i + f i g i − 1 + f i − 1 g i ) ∑ i = 0 min ( n , m ) ( 2 f i g i + f i g i − 1 + f i − 1 g i ) 。
以自然数为例。记上述算法中 s − 1 s − 1 的值依次为 p 0 , p 1 , p 2 , ⋯ , p n p 0 , p 1 , p 2 , ⋯ , p n ,有:
f t = n − 1 ∏ i = 0 ( t + p i ) f t = ∏ i = 0 n − 1 ( t + p i )
可以直接分治乘再多点求值做,常数很大。
更好的做法是分治下降幂卷积,下降幂多项式容易转成点值。
总时间复杂度 O ( n log 2 n ) O ( n log 2 n ) ,常数较大。
P8554 心跳
组合对象符号化板题
%%%粉兔
考虑序列中所有前缀最大值 x 1 , x 2 , ⋯ , x k x 1 , x 2 , ⋯ , x k ,以它们为左端点将原序列划分为 k k 段。
考虑每一段 [ l , r ] [ l , r ] 内的 a i a i 取值,显然 a l + 1 = ⋯ = a r = k a l + 1 = ⋯ = a r = k ,而对于 a l a l 有结论:
总可以通过排列 p l + 1 , ⋯ , p r p l + 1 , ⋯ , p r ,使得 a l a l 取到 [ k , k + r − l ] [ k , k + r − l ] 的所有值。如果 l > 1 l > 1 ,还可取到 k − 1 k − 1 。
记 b i = a i − k b i = a i − k ,那么每一段一定是 [ − 1 ] , [ 0 , 0 ] , [ 1 , 0 , 0 ] , ⋯ [ − 1 ] , [ 0 , 0 ] , [ 1 , 0 , 0 ] , ⋯ 中的一个接若干个 0 0 。
注意到不同的 { b i } { b i } 一定对应不同 { a i } { a i } ,下面考虑计数 ( { b i } , k ) ( { b i } , k ) 。
考虑对某个 { b i } { b i } ,k k 的取值为连续区间 [ L , R ] [ L , R ] 。设 h n , i h n , i 表示 k k 能取到 i i 的 { b i } { b i } 数量。下面求 f n , i , g n , i f n , i , g n , i 分别表示 L = i L = i 或 R = i R = i 的 { b i } { b i } 个数。则有 h n , i = i ∑ j = 1 f n , j − i − 1 ∑ j = 1 g n , j h n , i = ∑ j = 1 i f n , j − ∑ j = 1 i − 1 g n , j 。
......
TopCoder 14563S RM717 Div1B DerangementsStrikeBack
先考虑如何计算错排数。
无自环环排列的指数型生成函数是:
F ( x ) = ∑ i ≥ 2 ( i − 1 ) ! x i i ! = − ln ( 1 − x ) − x F ( x ) = ∑ i ≥ 2 ( i − 1 ) ! x i i ! = − ln ( 1 − x ) − x
那么错排即无自环环排列的自由组合,即:
G ( x ) = exp F ( x ) = e − x 1 − x G ( x ) = exp F ( x ) = e − x 1 − x
是 D-finite 的,可以化成整式递推 O ( n ) O ( n ) 计算。
回到原问题,设现在计算 k k 的答案。考虑先填 1 ∼ k 1 ∼ k 的数,那么剩下的数可以随意填,方案数即 n ! n ! 。
若由每个 i i 向 p i ( p i ≤ k ) p i ( p i ≤ k ) 连边,那么会形成若干形如 v 1 > k , v 2 ≤ k , ⋯ , v m ≤ k v 1 > k , v 2 ≤ k , ⋯ , v m ≤ k 的链即若干非自环的环。考虑按以下方式计数:
对于每个 i > k i > k ,选择集合 S i ∈ { 1 , ⋯ , k } S i ∈ { 1 , ⋯ , k } 。所有 S i S i 两两不交。
对于每个 i > k i > k ,安排 S i S i 中元素的顺序以形成一条链,方案数为 | S i | ! | S i | ! 。
对于不在任何 S i S i 中出现的元素 t ≤ k t ≤ k ,形成错排,方案数为 D n − ∑ n i = k + 1 | S i | D n − ∑ i = k + 1 n | S i | 。
写成生成函数即:
H ( x ) = ( ∑ i ≥ 0 i ! x i i ! ) n G ( x ) = e − x ( 1 − x ) n + 1 H ( x ) = ( ∑ i ≥ 0 i ! x i i ! ) n G ( x ) = e − x ( 1 − x ) n + 1
也是 D-finite 的,可以化成整式递推:
H ′ ( x ) = n + x 1 − x H ( x ) H ′ ( x ) = n + x 1 − x H ( x )
h k = ( n + k − 1 ) h k + h k − 1 k h k = ( n + k − 1 ) h k + h k − 1 k
总时间复杂度 O ( m ) O ( m ) 。
*可能更快(dai)速(shu)的做法:容斥后再写成生成函数。
2020ICPC 济南 H Path Killer
类似 ABC242Ex Random Painting,停时期望等于所有非法状态 出现的概率 乘上 离开该状态期望时间 的和。
只需要对每个 k k 求出选中 k k 个点没有覆盖所有路径的方案数即可,容斥变为覆盖所有路径的方案数。
设 f u , i , j f u , i , j 表示考虑 u u 的子树,还未覆盖的路径向上延申的长度为 i i ,已经选了 j j 个点的方案数。先树形依赖背包合并,再枚举当前点是否选转移。
暴力转移复杂度 O ( n 5 ) O ( n 5 ) 。注意到第二维是 min min 卷积,第三维是树形依赖背包,故可优化至 O ( n 3 ) O ( n 3 ) 。
*使用 Min-Max 容斥可以做到同样复杂度,虽然一般这两种方法貌似不能同时使用。
SPOJ-RNG Random Number Generator | HDU6309 Absolute
对于定义在 R R 上的函数 f ( x ) , g ( x ) f ( x ) , g ( x ) ,定义连续卷积为定义在 R R 上的函数 h ( x ) h ( x ) ,对所有 x ∈ R x ∈ R 满足:
h ( x ) = ∫ ∞ − ∞ f ( t ) g ( x − t ) d t h ( x ) = ∫ − ∞ ∞ f ( t ) g ( x − t ) d t
若 f ( x ) , g ( x ) f ( x ) , g ( x ) 均为分段函数且每一段为低次多项式,可以考虑这样求解:
枚举 f ( x ) f ( x ) 中的每一段 ∀ x ∈ [ l , r ] , f ( x ) = F ( x ) ∀ x ∈ [ l , r ] , f ( x ) = F ( x ) ,g ( x ) g ( x ) 中的每一段 ∀ x ∈ [ L , R ] , g ( x ) = G ( x ) ∀ x ∈ [ L , R ] , g ( x ) = G ( x ) ,其中 F ( x ) , G ( x ) F ( x ) , G ( x ) 分别为 d 1 , d 2 d 1 , d 2 次多项式。
下面假设 r + L ≤ l + R r + L ≤ l + R ,否则交换 F ( x ) , G ( x ) F ( x ) , G ( x ) 。
计算二元多项式 s ( t , x ) = f ( t ) g ( x − t ) s ( t , x ) = f ( t ) g ( x − t ) ,关于 t t 求 s ( t , x ) s ( t , x ) 的不定积分 S ( t , x ) = ∫ s ( t , x ) d t + C S ( t , x ) = ∫ s ( t , x ) d t + C 。
对于某个 x x ,t t 需要满足 l ≤ t ≤ r ∧ L ≤ x − t ≤ R l ≤ t ≤ r ∧ L ≤ x − t ≤ R 。对 t t 的取值区间进行分类讨论:
当 x ∈ [ l + L , r + L ] x ∈ [ l + L , r + L ] 时,t ∈ [ l , x − L ] t ∈ [ l , x − L ] ,故 h ( x ) = S ( x − L , x ) − S ( l , x ) h ( x ) = S ( x − L , x ) − S ( l , x ) 。
当 x ∈ [ r + L , l + R ] x ∈ [ r + L , l + R ] 时,t ∈ [ l , r ] t ∈ [ l , r ] ,故 h ( x ) = S ( r , x ) − S ( l , x ) h ( x ) = S ( r , x ) − S ( l , x ) 。
当 x ∈ [ l + R , r + R ] x ∈ [ l + R , r + R ] 时,t ∈ [ x − R , r ] t ∈ [ x − R , r ] ,故 h ( x ) = S ( r , x ) − S ( x − R , x ) h ( x ) = S ( r , x ) − S ( x − R , x ) 。
以上所有操作均可以在 O ( ( d 1 + d 2 ) 3 ) O ( ( d 1 + d 2 ) 3 ) 时间内完成,同时注意到若设 f ( x ) f ( x ) 共 n n 段,g ( x ) g ( x ) 共 m m 段,则分段端点至多只有 ( n − 1 ) ( m − 1 ) ( n − 1 ) ( m − 1 ) 个。故可以利用差分与前缀和在 O ( n m ( d 1 + d 2 ) 3 ) O ( n m ( d 1 + d 2 ) 3 ) 内计算 h ( x ) h ( x ) 。
注意到 h ( x ) h ( x ) 内每一段的次数不高于 d 1 + d 2 + 1 d 1 + d 2 + 1 ,故若计算 n n 个函数 f 1 ( x ) , f 2 ( x ) , ⋯ , f n ( x ) f 1 ( x ) , f 2 ( x ) , ⋯ , f n ( x ) 的连续卷积,设其次数分别为 d 1 , d 2 , ⋯ , d n d 1 , d 2 , ⋯ , d n ,段数分别为 k 1 , k 2 , ⋯ , k n k 1 , k 2 , ⋯ , k n ,则可以在 O ( ∏ ( k i + 1 ) ( ∑ d i + n ) 3 ) O ( ∏ ( k i + 1 ) ( ∑ d i + n ) 3 ) 内计算其连续卷积。
直接计算 n n 个 0 0 次多项式的连续卷积 h ( x ) h ( x ) (即答案的概率密度函数)。
对于 RNG,对 h ( x ) h ( x ) 每一段 [ A , B ] [ A , B ] 内的部分进行积分求和即可。
对于 ABS,对 h ( x ) h ( x ) 每一段乘上 x x 再积分求和即可。
总时间复杂度 O ( n 3 2 n ) O ( n 3 2 n ) 。
QOJ5031 2022集训队互测 核
先考虑如何对某个 B B 求 f ( B ) f ( B ) 。注意到 A A 的每一行相互独立,设 A A 中某一行为向量 a a ,则 a a 需要满足:
a B = a a B = a
即 a a 为 B B 的特征值为 1 1 对应的特征向量。那么设 B B 特征值为 1 1 对应的特征子空间 V 1 V 1 维数为 d d ,则 a a 的方案数为 q d q d 。
下面对每个 k ∈ [ 0 , n ] k ∈ [ 0 , n ] 求出 V 1 V 1 维数为 k k 的矩阵(或视为线性变换)B B 个数 f k f k 。
考虑容斥,设钦定 V 1 V 1 至少 k k 维的矩阵 B B 个数为 g k g k ,于是有:
g k = n ∑ i = k ( i k ) q f i g k = ∑ i = k n ( i k ) q f i
这是因为考虑 f i f i 对 g k g k 的贡献,相当于在 k k 维空间中选出 i i 维子空间,方案数为 ( i k ) q ( i k ) q 。
考虑如何计算 g k g k ,先从 n n 维空间中选出 k k 维空间钦定为特征子空间(这 k k 维的线性变换就确定了),方案数为 ( n k ) q ( n k ) q ;再对剩下的 n − k n − k 维确定一个满秩的线性变换,方案数为 n − 1 ∏ i = k ( q n − q i ) ∏ i = k n − 1 ( q n − q i ) 。于是:
g k = ( n k ) q n − 1 ∏ i = k ( q n − q i ) g k = ( n k ) q ∏ i = k n − 1 ( q n − q i )
由子空间反演,得:
f k = n ∑ i = k ( − 1 ) i − k q ( i − k 2 ) ( i k ) q g i = n ∑ i = k ( − 1 ) i − k q ( i − k 2 ) ( i k ) q ( n i ) q n − 1 ∏ t = i ( q n − q t ) = n ∑ i = k ( − 1 ) i − k q ( i − k 2 ) ( n k ) q ( n − k i − k ) q n − 1 ∏ t = i ( q n − q t ) = ( n k ) q n − k ∑ i = 0 ( − 1 ) i q ( i 2 ) ( n − k i ) q n − 1 ∏ t = i + k ( q n − q t ) = ( n k ) q n − k ∑ i = 0 ( − 1 ) n − k q ( i 2 ) ( n − k i ) q q ( n 2 ) − ( i + k 2 ) ( q ; q ) n − i − k = ( n k ) q ( − 1 ) n − k ( q ; q ) n − k q ( n 2 ) − ( k 2 ) n − k ∑ i = 0 q − i k 1 ( q ; q ) i f k = ∑ i = k n ( − 1 ) i − k q ( i − k 2 ) ( i k ) q g i = ∑ i = k n ( − 1 ) i − k q ( i − k 2 ) ( i k ) q ( n i ) q ∏ t = i n − 1 ( q n − q t ) = ∑ i = k n ( − 1 ) i − k q ( i − k 2 ) ( n k ) q ( n − k i − k ) q ∏ t = i n − 1 ( q n − q t ) = ( n k ) q ∑ i = 0 n − k ( − 1 ) i q ( i 2 ) ( n − k i ) q ∏ t = i + k n − 1 ( q n − q t ) = ( n k ) q ∑ i = 0 n − k ( − 1 ) n − k q ( i 2 ) ( n − k i ) q q ( n 2 ) − ( i + k 2 ) ( q ; q ) n − i − k = ( n k ) q ( − 1 ) n − k ( q ; q ) n − k q ( n 2 ) − ( k 2 ) ∑ i = 0 n − k q − i k 1 ( q ; q ) i
记 h k = k ∑ i = 0 q − ( n − k ) i 1 ( q ; q ) i h k = ∑ i = 0 k q − ( n − k ) i 1 ( q ; q ) i ,考虑 h k + 1 h k + 1 :
h k + 1 = k + 1 ∑ i = 0 q − ( n − k − 1 ) i 1 ( q ; q ) i = k + 1 ∑ i = 0 q − ( n − k ) i 1 ( q ; q ) i [ 1 − ( 1 − q i ) ] = k + 1 ∑ i = 0 q − ( n − k ) i 1 ( q ; q ) i − k + 1 ∑ i = 1 q − ( n − k ) i 1 ( q ; q ) i − 1 = h k + q − ( n − k ) ( k + 1 ) 1 ( q ; q ) k + 1 − q − ( n − k ) h k = ( 1 − q − ( n − k ) ) h k + q − ( n − k ) ( k + 1 ) ( q ; q ) k + 1 h k + 1 = ∑ i = 0 k + 1 q − ( n − k − 1 ) i 1 ( q ; q ) i = ∑ i = 0 k + 1 q − ( n − k ) i 1 ( q ; q ) i [ 1 − ( 1 − q i ) ] = ∑ i = 0 k + 1 q − ( n − k ) i 1 ( q ; q ) i − ∑ i = 1 k + 1 q − ( n − k ) i 1 ( q ; q ) i − 1 = h k + q − ( n − k ) ( k + 1 ) 1 ( q ; q ) k + 1 − q − ( n − k ) h k = ( 1 − q − ( n − k ) ) h k + q − ( n − k ) ( k + 1 ) ( q ; q ) k + 1
h k h k 可以线性递推,于是可以在 O ( n ) O ( n ) 内求出所有 f k f k 。
还有一个小问题:如何快速计算 n ∑ k = 0 f k 3 q k n ∑ k = 0 n f k 3 q k n ?
设 B = ⌈ √ m o d ⌉ B = ⌈ m o d ⌉ ,对每个 i ∈ [ 0 , B ) i ∈ [ 0 , B ) 预处理出 3 i 3 i 及 3 B i 3 B i ,计算幂时直接查询即可。
总时间复杂度 O ( n + √ m o d ) O ( n + m o d ) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步