每个细菌都有一个 s s s 值。
最初只有一个细菌。每一天原先的细菌都会生一个孩子,且孩子的 s s s 值小于母体的 s s s 值。
给定 n n n 和 2 n 2^n 2 n 个数。
判断是否存在一种情况,经过 n n n 天后所有细菌的 s s s 值为给定的数。
n ≤ 1 0 5 , s i ≤ 1 0 9 n \le 10^5,s_i \le 10^9 n ≤ 1 0 5 , s i ≤ 1 0 9
首先最大的数一定是原始细菌的 s s s 值。然后考虑第 i i i 天的细菌,它们所选择的 s s s 一定要尽可能的大,如果选小了会使它们的后代选择变少。
然后对于每一天产生的每个细菌都按顺序贪心地选择一个尽可能大的值。
同一天选择的顺序是无关紧要 的,下面给出证明:
考虑第 i i i 天有两个选择的顺序上相邻 的细菌 a , b a, b a , b ,记它们父亲的 s 分别为 A , B ( A < B ) A, B (A < B) A , B ( A < B ) 。
如果让 a a a 先选,且两者的 s s s 分别为 x , y ( x < y ) x,y(x<y) x , y ( x < y ) 。
若 y < A y < A y < A ,那么交换顺序后两者的 s s s 就为 y , x y,x y , x 。
由于 a , b a, b a , b 在同一天产生,它们在决定后续方案时的地位 相同,那么选择的顺序也就无关紧要了。
若 y > A y > A y > A ,那么交换顺序后两者的 s 不变,选择的顺序连方案都不会影响。
为了方便,把父亲编号为 j ( j < 2 i ) j(j<2^i) j ( j < 2 i ) 的细菌编号为 j + 2 i j+2^i j + 2 i 。
然后直接按编号顺序确定 s s s 就行了,为了支持删除和查找前驱,可以用 multiset
来维护没被选择的 s s s 。
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <bits/stdc++.h> #define rep(i, l, r) for(int i = (l); i <= (r); i++) #define per(i, r, l) for(int i = (r); i >= (l); i--) #define mem(a, b) memset(a, b, sizeof a) using namespace std;int main () { cin >> n, m = 1 << n; multiset <int , greater <int > > s; For (i, 0 , m) s.insert (read ()); vector <int > c; c.push_back (*s.begin ()), s.erase (s.begin ()); For (i, 0 , m) { For (j, 0 , 1 << i) { auto it = s.upper_bound (c[j]); if (it != s.end ()) c.push_back (*it), s.erase (it); else return puts ("No" ) < 0 ; } } return puts ("Yes" ) < 0 ; return 0 ; }
对于 n × m n\times m n × m 的 01 01 0 1 矩阵 m a t mat m a t ,定义序列 A , B , C A,B,C A , B , C :
A i ( 1 ≤ i ≤ n ) A_i(1\le i \le n) A i ( 1 ≤ i ≤ n ) 表示最小的 j j j 满足 m a t i , j = 1 mat_{i,j}=1 m a t i , j = 1 (如果没有则为 m + 1 m+1 m + 1 )。
B i ( 1 ≤ i ≤ m ) B_i(1\le i \le m) B i ( 1 ≤ i ≤ m ) 表示最小的 j j j 满足 m a t j , i = 1 mat_{j,i}=1 m a t j , i = 1 (如果没有则为 n + 1 n+1 n + 1 )。
C i ( 1 ≤ i ≤ n ) C_i(1\le i \le n) C i ( 1 ≤ i ≤ n ) 表示最大的 j j j 满足 m a t j , i = 1 mat_{j,i}=1 m a t j , i = 1 (如果没有则为 0 0 0 )。
有多少种不同的三元组 ( A , B , C ) (A,B,C) ( A , B , C ) ?模 998244353 998244353 9 9 8 2 4 4 3 5 3 。
n ≤ 8000 , m ≤ 200 n \le 8000,m\le 200 n ≤ 8 0 0 0 , m ≤ 2 0 0
设 d p m , n dp_{m,n} d p m , n 表示 强制 每行至少有一个黑格时 n × m n\times m n × m 矩阵的答案。
那么答案就是 ∑ i = 0 N ( N i ) d p M , i \sum_{i=0}^N\binom Nidp_{M,i} ∑ i = 0 N ( i N ) d p M , i 。
转移考虑哪些行的第一个黑格在最后一列,分两种情况:
没有任何一行的第一个黑格在最后一列,那么最后一列可以没有黑格,可以恰好有一个,也可以多于一个,三种的方案对应的情况数分别是 1 , n , ( n 2 ) 1,n,\binom n2 1 , n , ( 2 n ) ,转移系数为 1 + n + ( n 2 ) 1+n+\binom n2 1 + n + ( 2 n ) 。
有 k ( k ≥ 1 ) k(k\ge 1) k ( k ≥ 1 ) 行的第一个黑格在最后一列,相当于最后一列已经事先填好了 k k k 个黑格,设这些黑格中自上到下第一个在第 a a a 行,最后一个在 倒数 第 b b b 行,这种方案对应的情况数是 a b ab a b ,转移系数为
∑ a , b ( a 1 ) ( n − a − b k − 2 ) ( b 1 ) = ( n + 2 k + 2 ) = ( n + 2 n − k ) \sum_{a,b}\binom a1\binom{n-a-b}{k-2}\binom b1=\binom{n+2}{k+2}=\binom{n+2}{n-k}
a , b ∑ ( 1 a ) ( k − 2 n − a − b ) ( 1 b ) = ( k + 2 n + 2 ) = ( n − k n + 2 )
综上,转移式为
d p m , n = d p m − 1 , n ( 1 + n + ( n 2 ) ) + ∑ k = 0 n − 1 d p m − 1 , k ( n + 2 k ) dp_{m,n}=dp_{m-1,n}(1+n+\binom n2)+\sum_{k=0}^{n-1}dp_{m-1,k}\binom{n+2}k
d p m , n = d p m − 1 , n ( 1 + n + ( 2 n ) ) + k = 0 ∑ n − 1 d p m − 1 , k ( k n + 2 )
转移可以使用 NTT 优化,复杂度 O ( N M log N ) O(NM\log N) O ( N M log N ) ,下面有复杂度更低的做法。
转移时乘的是组合数,考虑写成 EGF:记 F m ( x ) = ∑ d p m , n x n n ! F_m(x)=\sum dp_{m,n}\frac{x^n}{n!} F m ( x ) = ∑ d p m , n n ! x n 。
d p m , n = ∑ k = 0 n d p m − 1 , k ( n + 2 k ) − n d p m − 1 , n dp_{m,n}=\sum_{k=0}^ndp_{m-1,k}\binom{n+2}k-ndp_{m-1,n}
d p m , n = k = 0 ∑ n d p m − 1 , k ( k n + 2 ) − n d p m − 1 , n
设
G ( x ) = ∑ n x n n ! ∑ k = 0 n − 2 d p m − 1 , k ( n k ) = F m − 1 ( x ) ( e x − x − 1 ) \begin{aligned}
G(x)&=\sum_n\frac{x^n}{n!}\sum_{k=0}^{n-2}dp_{m-1,k}\binom nk\\
&=F_{m-1}(x)(e^x-x-1)
\end{aligned}
G ( x ) = n ∑ n ! x n k = 0 ∑ n − 2 d p m − 1 , k ( k n ) = F m − 1 ( x ) ( e x − x − 1 )
那么把 G ( x ) G(x) G ( x ) 中 x n n ! \frac{x^n}{n!} n ! x n 的系数左移 2 2 2 就可以得到转移式的第一部分,可以用求导实现左移 x n n ! \frac{x^n}{n!} n ! x n 的系数。
易得第二部分为 − x F m − 1 ′ ( x ) -xF_{m-1}'(x) − x F m − 1 ′ ( x ) 。
得到 F m ( x ) F_m(x) F m ( x ) 的转移式:
F m ( x ) = ( F m − 1 ( x ) ( e x − 1 − x ) ) ′ ′ − x F m − 1 ′ ( x ) F_m(x)=(F_{m-1}(x)(e^x-1-x))''-xF_{m-1}'(x)
F m ( x ) = ( F m − 1 ( x ) ( e x − 1 − x ) ) ′ ′ − x F m − 1 ′ ( x )
由于这个转移式中 F m − 1 ( x ) F_{m-1}(x) F m − 1 ( x ) 只乘了 e x , x e^x,x e x , x 两个和 x x x 有关的东西,考虑把 F m ( x ) F_m(x) F m ( x ) 写成 ∑ a , b f a , b e a x x b \sum_{a,b}f_{a,b}e^{ax}x^b ∑ a , b f a , b e a x x b ,显然 F m ′ ( x ) F_m'(x) F m ′ ( x ) 也可以写成这个形式,并且 e x e^x e x 和 x x x 和最高次幂都不会比 F m ( x ) F_m(x) F m ( x ) 大,所以 F m ( x ) F_m(x) F m ( x ) 中 e x e^x e x 和 x x x 的最高次幂最多比 F m − 1 ( x ) F_{m-1}(x) F m − 1 ( x ) 中 e x e^x e x 和 x x x 的最高次幂大 1 1 1 ,即不超过 m m m 。
在 ∑ a , b f a , b e a x x b \sum_{a,b}f_{a,b}e^{ax}x^b ∑ a , b f a , b e a x x b 的形式下,乘 e x , x e^x,x e x , x 以及求导都是简单的。至此,已经可以 O ( m 2 ) O(m^2) O ( m 2 ) 地从 F m − 1 ( x ) F_{m-1}(x) F m − 1 ( x ) 推出 F m ( x ) F_m(x) F m ( x ) 的 ∑ a , b f a , b e a x x b \sum_{a,b}f_{a,b}e^{ax}x^b ∑ a , b f a , b e a x x b 表示。
最后考虑算答案,设 F M ( x ) = ∑ a , b f a , b e a x x b F_M(x)=\sum_{a,b}f_{a,b}e^{ax}x^b F M ( x ) = ∑ a , b f a , b e a x x b 。
∑ i = 0 N ( N i ) d p M , i = ∑ i = 0 N ( N i ) [ x i i ! ] F M ( x ) = [ x N N ! ] e x F M ( x ) = N ! ∑ a = 0 M ∑ b = 0 min ( N , M ) f a , b ( a + 1 ) N − b ( N − b ) ! = ∑ a = 0 M ∑ b = 0 min ( N , M ) f a , b ( a + 1 ) N − b N b ‾ \begin{aligned}
&\sum_{i=0}^N\binom Nidp_{M,i}\\
=&\sum_{i=0}^N\binom Ni\left[\frac{x^i}{i!}\right]F_M(x)\\
=&\left[\frac{x^N}{N!}\right]e^xF_M(x)\\
=&N!\sum_{a=0}^M\sum_{b=0}^{\min(N,M)}f_{a,b}\frac{(a+1)^{N-b}}{(N-b)!}\\
=&\sum_{a=0}^M\sum_{b=0}^{\min(N,M)}f_{a,b}(a+1)^{N-b}N^{\underline b}
\end{aligned}
= = = = i = 0 ∑ N ( i N ) d p M , i i = 0 ∑ N ( i N ) [ i ! x i ] F M ( x ) [ N ! x N ] e x F M ( x ) N ! a = 0 ∑ M b = 0 ∑ m i n ( N , M ) f a , b ( N − b ) ! ( a + 1 ) N − b a = 0 ∑ M b = 0 ∑ m i n ( N , M ) f a , b ( a + 1 ) N − b N b
计算答案复杂度 O ( M 2 log N ) O(M^2\log N) O ( M 2 log N ) 或 O ( M 2 + M log N ) O(M^2+M\log N) O ( M 2 + M log N ) ,总复杂度 O ( M 3 ) O(M^3) O ( M 3 ) 。
容易想到用位向量来表示折线,0 0 0 表示这一步向左走,1 1 1 表示向右,容易得到折线的形态只有 2 N − 1 2^{N-1} 2 N − 1 种。
由于相邻两条折线 S , T S,T S , T 的约束关系是 T T T 的每个前缀和都大于等于 S S S 的对应前缀和。
不难想到轮廓线 DP,设 f i , j , k , S f_{i,j,k,S} f i , j , k , S 表示满足以下条件的方案数:
第 i i i 条折线已经填了前 j j j 位。
S S S 的前 j j j 位是第 i i i 条折线的,后 N − 1 − j N-1-j N − 1 − j 位是第 i − 1 i-1 i − 1 条折线的。
第 i − 1 i-1 i − 1 条折线前 j j j 位之和为 k k k 。
转移就枚举第 i i i 条折线第 j + 1 j+1 j + 1 为填什么。
复杂度 O ( n 3 2 n ) O(n^32^n) O ( n 3 2 n ) ,无法通过。
再次考虑相邻两条折线 S , T S,T S , T 的约束关系,发现从 S S S 到 T T T 是以下过程:
重新定义 DP 状态 f i , j , S f_{i,j,S} f i , j , S 表示正在确定了第 i i i 条折线,当前为 S S S ,已经固定了前 j j j 个 1 1 1 的方案数。
转移为:
如果存在第 j + 1 j+1 j + 1 个 1 1 1 ,就枚举它往前移多少位,不能跨过前一个 1 1 1 ,这个枚举量平均是 O ( 1 ) O(1) O ( 1 ) 的。
如果不存在,要么确定第 i i i 条折线,要么枚举最后一个 1 1 1 之后的一个 0 0 0 把它变成 1 1 1 ,这个枚举量平均也是 O ( 1 ) O(1) O ( 1 ) 的。
当确定第 i i i 条折线后把不合法的状态置成 0 0 0 。
复杂度 O ( n 2 2 n ) O(n^22^n) O ( n 2 2 n ) 。
考虑从 1 − n 1-n 1 − n 只有一条点不重复的路径的充要条件:
把这条唯一路径上的边都断开后路径上的点两两不连通。
假设知道这条唯一路径是 u 1 , u 2 , ⋯ , u k u_1,u_2,\cdots,u_k u 1 , u 2 , ⋯ , u k (u 1 = 1 , u k = n u_1=1,u_k=n u 1 = 1 , u k = n ),要将点集划分成 k k k 份,第 i i i 份包含 u k u_k u k ,最大化每个点集内部的边权之和。
可以得到一个状压做法:
设 g S g_S g S 表示两个端点都在点集 S S S 内部的所有边的权值之和。
设 f S f_S f S 表示点集 S S S 已经被考虑时,最大的保留边权之和。
转移为:f S ← f S − T + g T ( T ⊆ S ) f_S \leftarrow f_{S-T} + g_T({T \subseteq S}) f S ← f S − T + g T ( T ⊆ S ) ,其中 T T T 恰好包含一个关键点。
由于并不知道这条路径,所以需要改一下 DP 状态:
设 f i , S f_{i,S} f i , S 表示点集 S S S 已经被考虑且 1 − i 1-i 1 − i 只有一条路径时,最大的保留边权之和。
转移为:
f i , S ∪ { i } ← f j , S + w ( j , i ) ( j ∉ S ) f_{i,S \cup \{i\}} \leftarrow f_{j,S} + w(j,i)(j \not\in S) f i , S ∪ { i } ← f j , S + w ( j , i ) ( j ∈ S ) 。
f i , S ∪ T ← f i , S + g T ∪ { i } ( S ∩ T = ∅ ) f_{i,S\cup T} \leftarrow f_{i,S}+g_{T\cup\{i\}}(S \cap T = \varnothing) f i , S ∪ T ← f i , S + g T ∪ { i } ( S ∩ T = ∅ ) 。
复杂度 O ( n 3 n ) O(n3^n) O ( n 3 n ) 。
由于一个连通块的贡献带有绝对值符号,不太好处理,变成枚举符号不会影响答案。
现在变成如下问题:
每个点有三种状态:正、负、删,代价分别为 − B i , A i , B i -B_i,A_i,B_i − B i , A i , B i 。
对于相邻的点 u , v u,v u , v ,如果它们的状态都不是删,就必须相同。
求最小代价。
想到最小割模型,由于每个点有三种状态,所以把每个点 i i i 变成两个点 U i , V i U_i,V_i U i , V i 。
用 ( S , U i ) , ( U i , V i ) , ( V i , T ) (S,U_i),(U_i,V_i),(V_i,T) ( S , U i ) , ( U i , V i ) , ( V i , T ) 三条边表示三种状态。
令它们的代价分别为 ∞ − B i , ∞ + A i , ∞ + B i \infty-B_i,\infty+A_i,\infty+B_i ∞ − B i , ∞ + A i , ∞ + B i ,那么这三条边一定恰好割掉一条。
对于相邻的点 ( i , j ) (i,j) ( i , j ) ,有两个约束关系:
不能同时割 ( S , U i ) , ( V j , T ) (S,U_i),(V_j,T) ( S , U i ) , ( V j , T ) ,如果要割 ( S , U i ) (S,U_i) ( S , U i ) ,说明 U i U_i U i 能到达 T T T ,如果要割 ( V j , T ) (V_j,T) ( V j , T ) ,说明 S S S 能到达 V j V_j V j ,所以连一条 ( V j , U i ) (V_j,U_i) ( V j , U i ) ,代价为 ∞ 2 \infty^2 ∞ 2 的边。
不能同时割 ( S , U j ) , ( V i , T ) (S,U_j),(V_i,T) ( S , U j ) , ( V i , T ) ,同理连一条 ( V i , U j ) (V_i,U_j) ( V i , U j ) ,代价为 ∞ 2 \infty^2 ∞ 2 的边。
最后答案为最小割减去 n ∞ n\infty n ∞ 。
先考虑一个弱化版问题:B i = 1 B_i=1 B i = 1 时怎么做。
这是一个经典问题,一般做法有两种:状压 DP 和 min-max 容斥。
它们的复杂度都是 O ( n 2 n ) O(n2^n) O ( n 2 n ) 或 O ( 2 n ) O(2^n) O ( 2 n ) 的,然而这题数据范围是 400 400 4 0 0 ,说明需要用的此题的特殊性质。
通过 min-max 容斥可以得出答案为
∑ S ( − 1 ) ∣ S ∣ + 1 ∑ i = 1 n A i ∑ i ∈ S A i \sum_{S}(-1)^{|S|+1}\frac{\sum_{i=1}^n A_i}{\sum_{i \in S} A_i}
S ∑ ( − 1 ) ∣ S ∣ + 1 ∑ i ∈ S A i ∑ i = 1 n A i
发现分母是小于 400 400 4 0 0 的非负整数!可以用背包数出每种分母的贡献 ∑ S ( − 1 ) ∣ S ∣ + 1 \sum_S(-1)^{|S|+1} ∑ S ( − 1 ) ∣ S ∣ + 1 。
设
f i , j = ∑ S ⊆ { 1 , 2 , ⋯ , i } ( − 1 ) ∣ S ∣ + 1 [ ∑ i ∈ S A i = j ] f_{i,j} = \sum_{S \subseteq \{1,2,\cdots,i\}}(-1)^{|S|+1}[\sum_{i \in S}A_i=j]
f i , j = S ⊆ { 1 , 2 , ⋯ , i } ∑ ( − 1 ) ∣ S ∣ + 1 [ i ∈ S ∑ A i = j ]
转移为 f i , j = f i − 1 , j − f i − 1 , j − A i f_{i,j}=f_{i-1,j}-f_{i-1,j-A_i} f i , j = f i − 1 , j − f i − 1 , j − A i ,答案为
( ∑ i = 1 n A i ) ∑ i = 0 400 f n , i i (\sum_{i=1}^n A_i)\sum_{i=0}^{400}\frac{f_{n,i}}i
( i = 1 ∑ n A i ) i = 0 ∑ 4 0 0 i f n , i
现在回到原问题,还是考虑 min-max 容斥,答案就是
∑ S ( − 1 ) ∣ S ∣ + 1 [ S \sum_{S}(-1)^{|S|+1}[S ∑ S ( − 1 ) ∣ S ∣ + 1 [ S 中第一次有元素达到目标时的期望步数 ] ] ]
设 p i = A i ∑ j ∈ S A j p_i=\frac{A_i}{\sum_{j \in S}A_j} p i = ∑ j ∈ S A j A i 。
根据期望的线性性质,期望步数可以分摊到经过每个状态上。所以后面那坨东西为:
∑ ∀ i ∈ S , c i < B i [ \sum_{\forall i \in S,c_i<B_i}[ ∑ ∀ i ∈ S , c i < B i [ 到达 c c c 状态的概率 ] ⋅ [ ]\cdot[ ] ⋅ [ 离开 c c c 状态的期望步数 ] ] ]
= ∑ ∀ i ∈ S , c i < B i ( ∑ i ∈ S c i ) ! ∏ i ∈ S c i ! ∏ i ∈ S p i c i ⋅ ∑ i = 1 n A i ∑ i ∈ S A i = ∑ ∀ i ∈ S , c i < B i ( ∑ i ∈ S c i ) ! ∏ i ∈ S c i ! ∏ i ∈ S A i c i ⋅ ∑ i = 1 n A i ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 \begin{aligned}
&=\sum_{\forall i \in S,c_i<B_i}\frac{(\sum_{i \in S}c_i)!}{\prod_{i \in S} c_i!}\prod_{i \in S}p_i^{c_i} \cdot \frac{\sum_{i=1}^n A_i}{\sum_{i \in S} A_i}\\
&=\sum_{\forall i \in S,c_i<B_i}\frac{(\sum_{i \in S}c_i)!}{\prod_{i \in S} c_i!}\prod_{i \in S}A_i^{c_i} \cdot \frac{\sum_{i=1}^n A_i}{(\sum_{i \in S} A_i)^{(\sum_{i \in S}c_i)+1}}
\end{aligned}
= ∀ i ∈ S , c i < B i ∑ ∏ i ∈ S c i ! ( ∑ i ∈ S c i ) ! i ∈ S ∏ p i c i ⋅ ∑ i ∈ S A i ∑ i = 1 n A i = ∀ i ∈ S , c i < B i ∑ ∏ i ∈ S c i ! ( ∑ i ∈ S c i ) ! i ∈ S ∏ A i c i ⋅ ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 ∑ i = 1 n A i
把前面说的东西拼起来,答案为:
∑ S ( − 1 ) ∣ S ∣ + 1 ∑ ∀ i ∈ S , c i < B i ( ∑ i ∈ S c i ) ! ∏ i ∈ S c i ! ∏ i ∈ S A i c i ⋅ ∑ i = 1 n A i ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 = ( ∑ i = 1 n A i ) ∑ S ( − 1 ) ∣ S ∣ + 1 ∑ ∀ i ∈ S , c i < B i ( ∑ i ∈ S c i ) ! ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 ⋅ ∏ i ∈ S A i c i c i ! \begin{aligned}
&\sum_S(-1)^{|S|+1}\sum_{\forall i \in S,c_i<B_i}\frac{(\sum_{i \in S}c_i)!}{\prod_{i \in S} c_i!}\prod_{i \in S}A_i^{c_i} \cdot \frac{\sum_{i=1}^n A_i}{(\sum_{i \in S} A_i)^{(\sum_{i \in S}c_i)+1}}\\
&=(\sum_{i=1}^n A_i)\sum_S(-1)^{|S|+1}\sum_{\forall i \in S,c_i<B_i}\frac{(\sum_{i \in S}c_i)!}{(\sum_{i \in S} A_i)^{(\sum_{i \in S}c_i)+1}} \cdot \prod_{i \in S}\frac{A_i^{c_i}}{c_i!}
\end{aligned}
S ∑ ( − 1 ) ∣ S ∣ + 1 ∀ i ∈ S , c i < B i ∑ ∏ i ∈ S c i ! ( ∑ i ∈ S c i ) ! i ∈ S ∏ A i c i ⋅ ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 ∑ i = 1 n A i = ( i = 1 ∑ n A i ) S ∑ ( − 1 ) ∣ S ∣ + 1 ∀ i ∈ S , c i < B i ∑ ( ∑ i ∈ S A i ) ( ∑ i ∈ S c i ) + 1 ( ∑ i ∈ S c i ) ! ⋅ i ∈ S ∏ c i ! A i c i
式子中比较难转移的东西就是 ∑ i ∈ S A i \sum_{i \in S} A_i ∑ i ∈ S A i 和 ∑ i ∈ S c i \sum_{i \in S}c_i ∑ i ∈ S c i ,把它们记状态里就行了。
状态为
f i , j , k = ∑ S ⊆ { 1 , 2 , ⋯ , i } ( − 1 ) ∣ S ∣ + 1 ∑ ∀ i ∈ S , c i < B i ∏ i ∈ S A i c i c i ! [ ∑ i ∈ S A i = j ∧ ∑ i ∈ S c i = k ] f_{i,j,k}=\sum_{S \subseteq \{1,2,\cdots,i\}}(-1)^{|S|+1}\sum_{\forall i \in S,c_i<B_i}\prod_{i \in S}\frac{A_i^{c_i}}{c_i!}[\sum_{i \in S} A_i=j \land \sum_{i \in S}c_i=k]
f i , j , k = S ⊆ { 1 , 2 , ⋯ , i } ∑ ( − 1 ) ∣ S ∣ + 1 ∀ i ∈ S , c i < B i ∑ i ∈ S ∏ c i ! A i c i [ i ∈ S ∑ A i = j ∧ i ∈ S ∑ c i = k ]
转移为
f i , j , k = f i − 1 , j , k − ∑ c = 0 B i − 1 f i − 1 , j − A i , k − c A i c c ! f_{i,j,k}=f_{i-1,j,k}-\sum_{c=0}^{B_i-1}f_{i-1,j-A_i,k-c}\frac{A_i^c}{c!}
f i , j , k = f i − 1 , j , k − c = 0 ∑ B i − 1 f i − 1 , j − A i , k − c c ! A i c
答案为
( ∑ i = 1 n A i ) ∑ i = 1 400 ∑ j = 0 400 j ! f n , i , j i j + 1 (\sum_{i=1}^n A_i)\sum_{i=1}^{400}\sum_{j=0}^{400}\frac{j!f_{n,i,j}}{i^{j+1}}
( i = 1 ∑ n A i ) i = 1 ∑ 4 0 0 j = 0 ∑ 4 0 0 i j + 1 j ! f n , i , j
分析一下时间复杂度,虽然每次转移的枚举量是 B i B_i B i ,但由于 ∑ i = 1 n B i \sum_{i=1}^nB_i ∑ i = 1 n B i 是 O ( n ) O(n) O ( n ) 的,所以总复杂度是 O ( n 3 ) O(n^3) O ( n 3 ) ,空间复杂度可以用滚动数组优化到 O ( n 2 ) O(n^2) O ( n 2 ) 。
考虑第三次操作前第 i i i 行一定由 ( i − 1 ) m + 1 (i-1)m+1 ( i − 1 ) m + 1 到 i m im i m 构成,记 ( i − 1 ) m + 1 (i-1)m+1 ( i − 1 ) m + 1 到 i m im i m 的颜色为 i i i 。
第二次操作的目标就是使颜色为 i i i 的数在第 i i i 行,所以第一次操作的目标就是使每一列 n n n 种都颜色各有一个。
先考虑如何确定第一列的颜色,这显然是一个行与颜色的完美匹配问题。由于任意选 i i i 行,这 i i i 行的颜色数至少为 i i i ,根据 Hall 定理,一定存在完美匹配。每一列依次求完美匹配就可以构造出一组解。
然后第二三次操作就非常简单了,复杂度 O ( n 4 ) O(n^4) O ( n 4 ) 。
UPD: 这本质是正则二分图匹配问题,有 O ( n 2 log n ) O(n^2\log n) O ( n 2 log n ) 的算法。
考虑什么样的排列 P P P 是能被造出来的。
考虑构造过程:每次选择一个头元素最小的序列 A i A_i A i ,删除 A i A_i A i 开头单调递减的一段,再继续找头元素最小的序列。
这启发我们把同时删除的元素看成一段,分段具有如下性质:
每一段是长度不超过 3 3 3 的单调递减序列。
每一段的头元素递增。
长度为 1 1 1 的段不少于长度为 2 2 2 的段(因为每一个长度为 2 2 2 的段必须要对应一个长度为 1 1 1 的段来一起构成一个 A i A_i A i )。
同时,只要满足上面三个条件,这个 P P P 就能被造出来的,将每个段配配对就可以得到一个生成 P P P 的 A A A 序列。
由于 P P P 和分段内容是一一对应的,问题转化为对合法的分段内容计数。
枚举长度分别为 1 , 2 , 3 1,2,3 1 , 2 , 3 的段数 c n t 1 , c n t 2 , c n t 3 cnt_1,cnt_2,cnt_3 c n t 1 , c n t 2 , c n t 3 ,满足 c n t 1 + 2 c n t 2 + 3 c n t 3 = 3 n cnt_1+2cnt_2+3cnt_3=3n c n t 1 + 2 c n t 2 + 3 c n t 3 = 3 n 和 c n t 1 ≥ c n t 2 cnt_1 \ge cnt_2 c n t 1 ≥ c n t 2 。
贡献即为
( c n t 1 + c n t 2 + c n t 3 c n t 1 , c n t 2 , c n t 3 ) ( 3 n ) ! ( c n t 1 + c n t 2 + c n t 3 ) ! 2 c n t 2 3 c n t 3 \binom{cnt_1+cnt_2+cnt_3}{cnt_1,cnt_2,cnt_3}\frac{(3n)!}{(cnt_1+cnt_2+cnt_3)!2^{cnt_2}3^{cnt_3}}
( c n t 1 , c n t 2 , c n t 3 c n t 1 + c n t 2 + c n t 3 ) ( c n t 1 + c n t 2 + c n t 3 ) ! 2 c n t 2 3 c n t 3 ( 3 n ) !
前面的组合数是划分出每一段的方案数,除以 ( c n t 1 + c n t 2 + c n t 3 ) ! (cnt_1+cnt_2+cnt_3)! ( c n t 1 + c n t 2 + c n t 3 ) ! 是保证每一段的头元素递增,除以 2 c n t 2 3 c n t 3 2^{cnt_2}3^{cnt_3} 2 c n t 2 3 c n t 3 是保证每一段的头元素为最大值。
复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
考虑如何描述一个非负凸序列。
枚举最小值 c c c ,以及取到最小值的第一个位置 i i i ,令 A = ( c , c , ⋯ , c ) A=(c,c,\cdots,c) A = ( c , c , ⋯ , c ) 。
多次选一个位置 j < i j<i j < i ,将 A j , A j − 1 , A j − 2 , ⋯ , A 1 A_j,A_{j-1},A_{j-2},\cdots,A_1 A j , A j − 1 , A j − 2 , ⋯ , A 1 分别加上 1 , 2 , 3 , ⋯ , j 1,2,3,\cdots,j 1 , 2 , 3 , ⋯ , j 。
多次选一个位置 j > i j>i j > i ,将 A j , A j + 1 , A j + 2 , ⋯ , A n A_j,A_{j+1},A_{j+2},\cdots,A_n A j , A j + 1 , A j + 2 , ⋯ , A n 分别加上 1 , 2 , 3 , ⋯ , n − j + 1 1,2,3,\cdots,n-j+1 1 , 2 , 3 , ⋯ , n − j + 1 ,若 i > 1 i>1 i > 1 则 i − 1 i-1 i − 1 必须被选到一次。
第三步可以事先选 i − 1 i-1 i − 1 一次,对总和产生 i ( i − 1 ) 2 \frac {i(i-1)}2 2 i ( i − 1 ) 的贡献,然后第三步就和第二步一样了。
先枚举 i i i ,第二三步本质上就是完全背包,由于体积的特性,有用的物品数量是 O ( m ) O(\sqrt m) O ( m ) 的,可以 O ( m m ) O(m\sqrt m) O ( m m ) 预处理出背包数组,然后 O ( m n ) O(\frac mn) O ( n m ) 枚举 c c c ,计算贡献。
这样做的复杂度为 O ( n m m ) O(nm\sqrt m) O ( n m m ) ,无法通过。
考虑 i → i + 1 i \rightarrow i+1 i → i + 1 时,物品最多删一个,也最多添一个,并且总改变次数是 O ( m ) O(\sqrt m) O ( m ) 的,动态维护背包即可做到 O ( m m ) O(m\sqrt m) O ( m m ) 的复杂度。
设 f i , a , b , j f_{i,a,b,j} f i , a , b , j 表示从以下局面出发,还没有赢的人中从左到右第 j j j 个人最终赢的概率。
有 a a a 个人还没有赢且已经排除了 i i i 个错误选项。
有 b b b 个人还没有赢且已经排除了 i + 1 i+1 i + 1 个错误选项。
转移就枚举这 a a a 个人中下一个人是赢还是输即可(这里 f i , 0 , b , j = f i + 1 , b , 0 , j f_{i,0,b,j}=f_{i+1,b,0,j} f i , 0 , b , j = f i + 1 , b , 0 , j )。
f i , a , b , j = w i n ⋅ f i , a − 1 , b , j − [ j > b ] + l o s t ⋅ f i , a − 1 , b + 1 , j ( j ≠ b + 1 ) f_{i,a,b,j}=win \cdot f_{i,a-1,b,j-[j>b]} + lost \cdot f_{i,a-1,b+1,j}(j\ne b+1) f i , a , b , j = w i n ⋅ f i , a − 1 , b , j − [ j > b ] + l o s t ⋅ f i , a − 1 , b + 1 , j ( j = b + 1 )
f i , a , b , b + 1 = w i n + l o s t ⋅ f i , a − 1 , b + 1 , b + 1 ( j ≤ b ) f_{i,a,b,b+1}=win + lost \cdot f_{i,a-1,b+1,b+1}(j\le b) f i , a , b , b + 1 = w i n + l o s t ⋅ f i , a − 1 , b + 1 , b + 1 ( j ≤ b )
复杂度 O ( n 4 ) O(n^4) O ( n 4 ) 。
考虑任意 k k k 道题的总分都小于任意 k + 1 k+1 k + 1 道题的总分这个限制,发现它等价于前 ⌈ n 2 ⌉ \lceil\frac n2\rceil ⌈ 2 n ⌉ 道题的总分小于后 ⌈ n 2 ⌉ − 1 \lceil\frac n2\rceil-1 ⌈ 2 n ⌉ − 1 道题的总分。
考虑如何生成一个合法的序列 A A A :
枚举第 ⌊ n 2 ⌋ + 1 \lfloor\frac n2\rfloor+1 ⌊ 2 n ⌋ + 1 道题的分值 c c c ,令 A = ( c , c , ⋯ , c ) A=(c,c,\cdots,c) A = ( c , c , ⋯ , c ) 。
多次选一个位置 j < ⌊ n 2 ⌋ + 1 j<\lfloor\frac n2\rfloor+1 j < ⌊ 2 n ⌋ + 1 ,将 A 1 , A 2 , ⋯ , A j A_1,A_2,\cdots,A_j A 1 , A 2 , ⋯ , A j 全部减一。
多次选一个位置 j > ⌊ n 2 ⌋ + 1 j>\lfloor\frac n2\rfloor+1 j > ⌊ 2 n ⌋ + 1 ,将 A j , A j + 1 , ⋯ , A n A_j,A_{j+1},\cdots,A_n A j , A j + 1 , ⋯ , A n 全部加一。
由于 A 1 ≥ 1 A_1 \ge 1 A 1 ≥ 1 ,所以第二种操作的次数不得超过 c − 1 c-1 c − 1 ,同理第三种操作的次数不得超过 n − c n-c n − c 。
设前 ⌈ n 2 ⌉ \lceil\frac n2\rceil ⌈ 2 n ⌉ 道题的总分减后 ⌈ n 2 ⌉ − 1 \lceil\frac n2\rceil-1 ⌈ 2 n ⌉ − 1 道题的总分为 x x x ,第一步后 x = c x=c x = c ,第二种操作每一次都会使 x x x 减小 j j j ,第三种操作每一次都会使 x x x 减小 n − j + 1 n-j+1 n − j + 1 ,因此第二、三种操作的总贡献要小于 c c c 。
可以看出这是一个完全背包,第二种操作就是添加体积为 1 , 2 , ⋯ , ⌊ n 2 ⌋ 1,2,\cdots,\lfloor\frac n2\rfloor 1 , 2 , ⋯ , ⌊ 2 n ⌋ 的物品,而且最多添加 c − 1 c-1 c − 1 个,第三种操作就是添加体积为 1 , 2 , ⋯ , ⌈ n 2 ⌉ − 1 1,2,\cdots,\lceil\frac n2\rceil-1 1 , 2 , ⋯ , ⌈ 2 n ⌉ − 1 的物品,最多添加 n − c n-c n − c 个,总体积要小于 c c c 。
对于第二种操作,考虑预处理 L i , j L_{i,j} L i , j 表示选择 i i i 个物品,总体积为 j j j 的方案数。用传统背包做复杂度肯定不行,事实上它能直接转移:
L i , j = L i − 1 , j − 1 + L i , j − i − L i − 1 , j − i − ⌊ n 2 ⌋ L_{i,j}=L_{i-1,j-1}+L_{i,j-i}-L_{i-1,j-i-\lfloor\frac n2\rfloor}
L i , j = L i − 1 , j − 1 + L i , j − i − L i − 1 , j − i − ⌊ 2 n ⌋
对于第三种操作,同理可以预处理 R i , j R_{i,j} R i , j 。
然后就可以枚举 c c c 后 O ( n ) O(n) O ( n ) 计算合法方案数。
复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
构造的思路是先黑白染色,然后填好黑格,再让每个白格满足:
它大于周围四个黑格。
它模周围四个黑格都等于 1 1 1 。
填白格的过程是容易的,对于一个白格,先算出周围四个黑格的 lcm \text{lcm} lcm ,然后尝试填 lcm + 1 \text{lcm}+1 lcm + 1 ,如果已经填过了,就继续尝试 2 lcm + 1 , 3 lcm + 1 , ⋯ 2\text{lcm}+1,3\text{lcm}+1,\cdots 2 lcm + 1 , 3 lcm + 1 , ⋯ 。
如果没有值域限制,这题就做完了,考虑怎样让填的数尽可能小。
填白格没有什么好优化的(尝试过优先填 lcm \text{lcm} lcm 较大的格子,但完全没有效果),所以考虑如何填黑格,才能使 lcm \text{lcm} lcm 比较小。
填法一:顺序填或随机填,大概只能构造 N N N 等于一百多。
填法二:考虑到一个白格周围四个黑格有两个是同一行的,有两个是同一列的,令 A i , j A_{i,j} A i , j 是 lcm(i,j) \text{lcm(i,j)} lcm(i,j) 的倍数,具体怎么确定,像确定白格那样确定,大概能构造 N N N 等于两百多。
填法三:考虑到一个白格周围四个黑格只涉及四条斜线,令 A i , j A_{i,j} A i , j 是 lcm ( i + j , i − j + n ) \text{lcm}(i+j,i-j+n) lcm ( i + j , i − j + n ) 的倍数,大概能构造 N N N 等于 425 425 4 2 5 左右。
填法四:经过一番尝试,令 A i , j A_{i,j} A i , j 是 lcm ( i + ( n − j + 1 ) , i − ( n − j + 1 ) + n ) \text{lcm}(i+(n-j+1),i-(n-j+1)+n) lcm ( i + ( n − j + 1 ) , i − ( n − j + 1 ) + n ) (就是把列编号倒过来)可以通过。
填发五:考虑给每条斜线分配一个质数,黑格就等于所在的两条斜线质数的乘积,白格就等于周围四条斜线质数的乘积加一,一定不会有数重复。
填发四需要用 set
维护哪些数填过,复杂度 O ( n 2 log n ) O(n^2\log n) O ( n 2 log n ) 。
填发五复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
对于两个距离为 D \sqrt D D 的点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) ( x 1 , y 1 ) , ( x 2 , y 2 ) ,考虑 x 1 − x 2 , y 1 − y 2 x_1-x_2,y_1-y_2 x 1 − x 2 , y 1 − y 2 的奇偶性:
x 1 ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) ⟺ D ≡ 0 ( m o d 4 ) x 1 ≡ x 2 ( m o d 2 ) , y 1 ≢ y 2 ( m o d 2 ) ⟺ D ≡ 1 ( m o d 4 ) x 1 ≢ x 2 ( m o d 2 ) , y 1 ≢ y 2 ( m o d 2 ) ⟺ D ≡ 2 ( m o d 4 ) \begin{aligned}
x_1 &\equiv x_2 \pmod 2,y_1 \equiv y_2 \pmod 2 \iff D \equiv 0 \pmod 4\\
x_1 &\equiv x_2 \pmod 2,y_1 \not\equiv y_2 \pmod 2 \iff D \equiv 1 \pmod 4\\
x_1 &\not\equiv x_2 \pmod 2,y_1 \not\equiv y_2 \pmod 2 \iff D \equiv 2 \pmod 4
\end{aligned}
x 1 x 1 x 1 ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) ⟺ D ≡ 0 ( m o d 4 ) ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) ⟺ D ≡ 1 ( m o d 4 ) ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) ⟺ D ≡ 2 ( m o d 4 )
因此 D m o d 4 D \bmod 4 D m o d 4 说明了两点坐标差的奇偶性。
引理:将平面上距离为 D \sqrt D D 的点对连边后是一张二分图。
考虑构造一个黑白染色方案,设 color ( x , y , D ) = 0 / 1 \text{color}(x,y,D)=0/1 color ( x , y , D ) = 0 / 1 表示点 ( x , y ) (x,y) ( x , y ) 的颜色。
当 D ≡ 3 ( m o d 4 ) D\equiv 3\pmod 4 D ≡ 3 ( m o d 4 ) 时,没有边,color ( x , y , D ) = 0 \text{color}(x,y,D)=0 color ( x , y , D ) = 0 。
当 D ≡ 2 ( m o d 4 ) D\equiv 2\pmod 4 D ≡ 2 ( m o d 4 ) 时,color ( x , y , D ) = x m o d 2 \text{color}(x,y,D)=x\bmod 2 color ( x , y , D ) = x m o d 2 ,这样距离为 D \sqrt D D 的点对就必然异色。
当 D ≡ 1 ( m o d 4 ) D \equiv 1\pmod 4 D ≡ 1 ( m o d 4 ) 时,color ( x , y , D ) = ( x + y ) m o d 2 \text{color}(x,y,D)=(x+y)\bmod 2 color ( x , y , D ) = ( x + y ) m o d 2 ,这样距离为 D \sqrt D D 的点对就必然异色。
当 D ≡ 0 ( m o d 4 ) D\equiv 0\pmod 4 D ≡ 0 ( m o d 4 ) 时,color ( x , y , D ) = color ( ⌊ x 2 ⌋ , ⌊ y 2 ⌋ , D 4 ) \text{color}(x,y,D)=\text{color}(\lfloor\frac x2\rfloor,\lfloor\frac y2\rfloor,\frac D4) color ( x , y , D ) = color ( ⌊ 2 x ⌋ , ⌊ 2 y ⌋ , 4 D ) ,下面证明为什么合法:
对于两个距离为 D \sqrt D D 的点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) ( x 1 , y 1 ) , ( x 2 , y 2 ) ,由于 x 1 ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) x_1 \equiv x_2 \pmod 2,y_1 \equiv y_2 \pmod 2 x 1 ≡ x 2 ( m o d 2 ) , y 1 ≡ y 2 ( m o d 2 ) ,所以
⌊ x 1 2 ⌋ − ⌊ x 2 2 ⌋ = 1 2 ( x 1 − x 2 ) ⌊ y 1 2 ⌋ − ⌊ y 2 2 ⌋ = 1 2 ( y 1 − y 2 ) \begin{aligned}
\lfloor\frac {x_1}2\rfloor-\lfloor\frac {x_2}2\rfloor&=\frac 12(x_1-x_2)\\
\lfloor\frac {y_1}2\rfloor-\lfloor\frac {y_2}2\rfloor&=\frac 12(y_1-y_2)
\end{aligned}
⌊ 2 x 1 ⌋ − ⌊ 2 x 2 ⌋ ⌊ 2 y 1 ⌋ − ⌊ 2 y 2 ⌋ = 2 1 ( x 1 − x 2 ) = 2 1 ( y 1 − y 2 )
进一步:
( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 = D ⇒ ( ⌊ x 1 2 ⌋ − ⌊ x 2 2 ⌋ ) 2 + ( ⌊ y 1 2 ⌋ − ⌊ y 2 2 ⌋ ) 2 = D 4 ⇒ color ( ⌊ x 1 2 ⌋ , ⌊ y 1 2 ⌋ , D 4 ) ≠ color ( ⌊ x 2 2 ⌋ , ⌊ y 2 2 ⌋ , D 4 ) \begin{aligned}
&(x_1-x_2)^2+(y_1-y_2)^2=D\\
\Rightarrow &(\lfloor\frac {x_1}2\rfloor-\lfloor\frac {x_2}2\rfloor)^2+(\lfloor\frac {y_1}2\rfloor-\lfloor\frac {y_2}2\rfloor)^2=\frac D4\\
\Rightarrow &\text{color}(\lfloor\frac {x_1}2\rfloor,\lfloor\frac {y_1}2\rfloor,\frac D4)\ne\text{color}(\lfloor\frac {x_2}2\rfloor,\lfloor\frac {y_2}2\rfloor,\frac D4)
\end{aligned}
⇒ ⇒ ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 = D ( ⌊ 2 x 1 ⌋ − ⌊ 2 x 2 ⌋ ) 2 + ( ⌊ 2 y 1 ⌋ − ⌊ 2 y 2 ⌋ ) 2 = 4 D color ( ⌊ 2 x 1 ⌋ , ⌊ 2 y 1 ⌋ , 4 D ) = color ( ⌊ 2 x 2 ⌋ , ⌊ 2 y 2 ⌋ , 4 D )
对于 D 1 D_1 D 1 和 D 2 D_2 D 2 分别黑白染色后本质有 4 4 4 种颜色,这 4 4 4 种颜色中肯定有一种点数大于等于 n 2 n^2 n 2 ,输出这种颜色的 n 2 n^2 n 2 个点即可。
复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
没有负环等价于差分约束有解,假设解为 d 1 , d 2 , ⋯ , d n d_1,d_2,\cdots,d_n d 1 , d 2 , ⋯ , d n ,不妨令 d 1 = 0 d_1=0 d 1 = 0 。
由于 i → i + 1 i\rightarrow i+1 i → i + 1 的边是不能被删的,所以 d d d 是单调不增的,也就是一段 0 0 0 ,一段 − 1 -1
− 1 ,一段 − 2 ⋯ -2\cdots − 2 ⋯ 的形式。
考虑一段一段的枚举 d d d ,上一段是 [ a , b ] [a,b] [ a , b ] ,即 d a , a + 1 , ⋯ , b = x + 1 d_{a,a+1,\cdots,b}=x+1 d a , a + 1 , ⋯ , b = x + 1 ,枚举了新的一段 [ b + 1 , c ] [b+1,c] [ b + 1 , c ] ,即 d b + 1 , b + 2 , ⋯ , c = x d_{b+1,b+2,\cdots,c}=x d b + 1 , b + 2 , ⋯ , c = x ,分析哪些边需要删:
对于 b + 1 ≤ i < j ≤ c b+1\le i < j \le c b + 1 ≤ i < j ≤ c ,边 ( i , j ) (i,j) ( i , j ) 需要删除。
对于 b + 1 ≤ i ≤ c , j < a b+1\le i\le c,j<a b + 1 ≤ i ≤ c , j < a ,边 ( i , j ) (i,j) ( i , j ) 需要删除。
然后就可以 DP 了,设 f a , b f_{a,b} f a , b 表示填的最后一段为 [ a , b ] [a,b] [ a , b ] 时的最小代价,转移为
f a , b + cost 1 ( b + 1 , c ) + cost 2 ( b + 1 , c , a − 1 ) → f b + 1 , c f_{a,b}+\text{cost}_1(b+1,c)+\text{cost}_2(b+1,c,a-1)\rightarrow f_{b+1,c}
f a , b + cost 1 ( b + 1 , c ) + cost 2 ( b + 1 , c , a − 1 ) → f b + 1 , c
其中 cost 1 \text{cost}_1 cost 1 和 cost 2 \text{cost}_2 cost 2 在预处理二维前缀和后可以 O ( 1 ) O(1) O ( 1 ) 算。
复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
如果 Snuke 按到了 p i = i p_i=i p i = i 的位置就死了,所以他要最小化有解时死的概率,分析 Snuke 的最优策略:
最初需要按下一个按钮,由于 Snuke 不知道排列,所以按每个按钮都是一样的,不妨按 1 1 1 。
如果按下了 p i = i p_i=i p i = i 的按钮就死了。
否则,p i p_i p i 一定是一个安全的按钮,继续按下 p i p_i p i ,这样就可以安全地按下许多按钮。
又需要尝试一个按钮时就按没按过的编号最小的按钮。
于是,得到了 Snuke 胜利的充要条件:假设 1 − A 1-A 1 − A 中第一个满足 p i = i p_i=i p i = i 的 i i i 为 min \min min ,∀ i > A , ∃ j < min \forall i>A,\exists j<\min ∀ i > A , ∃ j < min 使得 j j j 能到达 i i i 。
容易想到枚举 min \min min ,把排列看成若干个循环,要求 min \min min 前面没有孤立点,这个可以容斥:
钦定 i i i 个孤立点,系数为 ( − 1 ) i ( min − 1 i ) (-1)^i\binom{\min-1}i ( − 1 ) i ( i m i n − 1 ) 。
对于 [ 1 , min − 1 ] [1,\min-1] [ 1 , min − 1 ] 中剩下的 min − 1 − i \min-1-i min − 1 − i 个点先生成若干个循环,方案数为 ( min − 1 − i ) ! (\min-1-i)! ( min − 1 − i ) ! 。
对于 [ A + 1 , n ] [A+1,n] [ A + 1 , n ] 中的点,它们只能加入前面的循环,方案数为 ( min − 1 − i ) n − A ‾ (\min-1-i)^{\overline{n-A}} ( min − 1 − i ) n − A 。
对于 [ min + 1 , A ] [\min+1,A] [ min + 1 , A ] 中的点,它们既可以加入前面的循环,又可以新建一个环,方案数为 ( min − 1 − i + n − A ) A − min ‾ (\min-1-i+n-A)^{\overline{A-\min}} ( min − 1 − i + n − A ) A − m i n 。
综上,得到 min \min min 的贡献为:
∑ i = 0 min − 1 ( − 1 ) i ( min − 1 i ) ( n − 1 − i ) ! ( min − 1 − i ) min − 1 − i + n − A \sum_{i=0}^{\min-1}(-1)^i\binom{\min-1}i\frac{(n-1-i)!(\min-1-i)}{\min-1-i+n-A}
i = 0 ∑ m i n − 1 ( − 1 ) i ( i min − 1 ) min − 1 − i + n − A ( n − 1 − i ) ! ( min − 1 − i )
当 min \min min 不存在时需要特判,贡献为:
∑ i = 0 A ( − 1 ) i ( A i ) ( n − i ) ! \sum_{i=0}^A(-1)^i\binom Ai(n-i)!
i = 0 ∑ A ( − 1 ) i ( i A ) ( n − i ) !
复杂度 O ( A 2 + n ) O(A^2+n) O ( A 2 + n ) 。
对于 T = 1 T=1 T = 1
将网络抽象成一张有向图:
将每条线的起点、终点和平衡器的端点抽象成结点。
同一条线上的结点后面向前面连边。
平衡器抽象成两个方向的边。
考虑暴力怎么做,枚举最终汇聚到第 t t t 条线,判断 t t t 的终点是否可以到达所有的起点。
可以用一个 bitset
来压哪些汇点能到达这个点,然后 DFS 来求这些 bitset
。可以做到 O ( n m ω ) O(\frac {nm}{\omega}) O ( ω n m ) 的复杂度。
对于 T = 2 T=2 T = 2
n = 2 n=2 n = 2 时显然无解,下面构造说明了 n > 2 n>2 n > 2 时一定有解。
考虑从右往左依次插入每个平衡器,维护 s i z e i size_i s i z e i 表示当前网络有多少个起点会到达第 i i i 条线的终点。
初始时,s i z e i = 1 size_i=1 s i z e i = 1 。
加入平衡器 ( x , y ) (x,y) ( x , y ) 时,要么 s i z e x + 1 size_x+1 s i z e x + 1 ,要么 s i z e y + 1 size_y+1 s i z e y + 1 ,选择 s i z e x size_x s i z e x 和 s i z e y size_y s i z e y 中较小的一个 + 1 +1 + 1 。一定不会出现 s i z e x = n − 1 ∧ s i z e y = n − 1 size_x=n-1\land size_y=n-1 s i z e x = n − 1 ∧ s i z e y = n − 1 的情况,因为 s i z e x + s i z e y ≤ n size_x+size_y\le n s i z e x + s i z e y ≤ n 。
复杂度 O ( n + m ) O(n+m) O ( n + m ) 。
以下解法可以解决 n ≤ 1 0 5 n \le 10^5 n ≤ 1 0 5 的问题。
设 F k F_k F k 表示确定 k k k 个位置的值 r i 1 , r i 2 , ⋯ , r i k ( i 1 < i 2 < ⋯ < i k ) r_{i_1},r_{i_2},\cdots,r_{i_k}(i_1<i_2<\cdots<i_k) r i 1 , r i 2 , ⋯ , r i k ( i 1 < i 2 < ⋯ < i k ) 满足以下条件的方案数:
∀ x ∈ [ 1 , k ] , r i x = p i x ∨ r i x = q i x \forall x\in[1,k],r_{i_x}=p_{i_x}\lor r_{i_x}=q_{i_x}
∀ x ∈ [ 1 , k ] , r i x = p i x ∨ r i x = q i x
根据二项式反演,答案为
∑ i = 0 n ( − 1 ) i F i ( n − i ) ! \sum_{i=0}^n(-1)^iF_i(n-i)!
i = 0 ∑ n ( − 1 ) i F i ( n − i ) !
将 p i , q i p_i,q_i p i , q i 连边,得到一张由若干个环组成的图,选择一个满足 r i = p i ∨ r i = q i r_i=p_i\lor r_i=q_i r i = p i ∨ r i = q i 的位置 i i i 就是选择一条边并占用一个端点,这对于每个环是独立的,所以对每个环求出 F F F 数组,再用分治 FFT 合并就可以得到整张图的 F F F 数组。
考虑求一个大小为 m m m 的环的 F F F 数组,假设点编号为 1 , 2 , ⋯ , m 1,2,\cdots,m 1 , 2 , ⋯ , m ,边为 ( 1 , 2 ) , ( 2 , 3 ) , ⋯ , ( m − 1 , m ) , ( m , 1 ) (1,2),(2,3),\cdots,(m-1,m),(m,1) ( 1 , 2 ) , ( 2 , 3 ) , ⋯ , ( m − 1 , m ) , ( m , 1 ) ,将选择 i i i 条边的方案分为以下两类:
不选边 ( 1 , 2 ) (1,2) ( 1 , 2 ) ,把边 ( 2 , 3 ) (2,3) ( 2 , 3 ) 占用 2 2 2 的方式编号为 1 1 1 ,边 ( 2 , 3 ) (2,3) ( 2 , 3 ) 占用 3 3 3 的方式编号为 2 2 2 ,边 ( 3 , 4 ) (3,4) ( 3 , 4 ) 占用 3 3 3 的方式编号为 3 3 3 ,边 ( 3 , 4 ) (3,4) ( 3 , 4 ) 占用 4 4 4 的方式编号为 4 4 4 ,依次类推。方案就是从 2 m − 2 2m-2 2 m − 2 种选择方式选 i i i 种,限制就是编号相邻的不能同时选择。
引理:从 n n n 个物品中选 r r r 个,编号相邻的不能同时选择的方案数为 ( n − r + 1 r ) \binom {n-r+1}r ( r n − r + 1 ) 。
证明:将选择的第 i i i 个物品的编号减去 i − 1 i-1 i − 1 就得到了从 n − r + 1 n-r+1 n − r + 1 个物品中选 r r r 个的方案数。
这部分方案数为 ( 2 m − i − 1 i ) \binom{2m-i-1}i ( i 2 m − i − 1 ) 。
选边 ( 1 , 2 ) (1,2) ( 1 , 2 ) ,那么边 ( 1 , 2 ) (1,2) ( 1 , 2 ) 可以占用 1 1 1 或 2 2 2 ,但两种方式是等价的,不妨假设占用了 1 1 1 。方案就是从 2 m − 3 2m-3 2 m − 3 种选择方式选 i − 1 i-1 i − 1 种,限制还是编号相邻的不能同时选择。
这部分方案数为 2 ( 2 m − i − 1 i − 1 ) 2\binom{2m-i-1}{i-1} 2 ( i − 1 2 m − i − 1 ) 。
对于一个大小为 m m m 的环
F i = ( 2 m − i − 1 i ) + 2 ( 2 m − i − 1 i − 1 ) = ( 2 m − i i ) + ( 2 m − i − 1 i − 1 ) F_i=\binom{2m-i-1}i+2\binom{2m-i-1}{i-1}=\binom{2m-i}i+\binom{2m-i-1}{i-1}
F i = ( i 2 m − i − 1 ) + 2 ( i − 1 2 m − i − 1 ) = ( i 2 m − i ) + ( i − 1 2 m − i − 1 )
然后每个环的 F F F 就可以 O ( n ) O(n) O ( n ) 求了,复杂度瓶颈在于分治 FFT,复杂度 O ( n log 2 n ) O(n\log^2n) O ( n log 2 n ) 。
分治 FFT 有两种优化:
由于每个环的大小之和为 n n n ,故只有 O ( n ) O(\sqrt n) O ( n ) 种大小不同的环,大小相同的环可以通过快速幂 O ( n log n ) O(n\log n) O ( n log n ) 地算出乘积。
整个分治过程形成一棵二叉树的结构,总时间就是 ∑ u ∈ l e a f degree u depth u \sum_{u\in \mathbb{leaf}}\text{degree}_u\text{depth}_u ∑ u ∈ l e a f degree u depth u ,最小化时间就是 Huffman 树,每次贪心地将两个次数最小的多项式乘起来。
走到了一个强连通分量就肯定会走完内部的所有点,缩点后图就变成了 DAG,假设原图就是 DAG。
想到用最小费用流解决:
把每个点 u u u 拆成 in u \text{in}_u in u 和 out u \text{out}_u out u 。
in u \text{in}_u in u 向 out u \text{out}_u out u 连一条容量为 1 1 1 ,费用为 − X u -X_u − X u 的边,再连一条容量为 K K K ,费用为 0 0 0 的边。
对于原图中的边 ( u , v ) (u,v) ( u , v ) ,out u \text{out}_u out u 向 in v \text{in}_v in v 连一条容量为 K K K ,费用为 0 0 0 的边。
S S S 向 in 1 \text{in}_1 in 1 连一条容量为 K K K ,费用为 0 0 0 的边,out u \text{out}_u out u 向 T T T 连一条容量为 K K K ,费用为 0 0 0 的边。
SSP 算法肯定是通过不了的,考虑变成 Primal-Dual 算法可以做的问题。
Sol 1
初始图是一张 DAG,可以跑一遍 DP 预处理最短路作为点的初始势能。
Sol 2
求出 DAG 的一组拓扑序,然后给每个点按拓扑序从大到小重新编号(也就是缩完点后的编号)。
容易构造一组满足差分约束的初始势能:
S S S 势能为 ∑ X u \sum X_u ∑ X u ,T T T 势能为 0 0 0 。
in u \text{in}_u in u 的势能为 ∑ i = 1 u X i \sum_{i=1}^uX_i ∑ i = 1 u X i ,out u \text{out}_u out u 的势能为 ∑ i = 1 u − 1 X i \sum_{i=1}^{u-1}X_i ∑ i = 1 u − 1 X i 。
上述两种做法复杂度都是 O ( n K log n ) O(nK\log n) O ( n K log n ) 。
考虑什么样的串能变成单个字母 a a a 或 b b b 。
打表发现能变成 a a a 的串 S S S 满足的 a , b a,b a , b 数量关系是 a a a 的数量减 b b b 的数量模 3 3 3 余 1 1 1 ,并且这个条件在 ∣ S ∣ |S| ∣ S ∣ 为偶数时也是充分条件,当 ∣ S ∣ |S| ∣ S ∣ 为奇数时恰好多了一个串 a b a b a b ⋯ a b a ababab\cdots aba a b a b a b ⋯ a b a 。
引理一:记 p ( S ) p(S) p ( S ) 表示 S S S 中 a a a 的个数减 b b b 的个数模 3 3 3 ,S S S 能变成单个字母 c c c 当且仅当:
p ( S ) = p ( c ) p(S)=p(c) p ( S ) = p ( c )
S = c S=c S = c 或 S S S 中有相邻的相同字母。
必要性显然,下面证明充分性:当 ∣ S ∣ ≤ 3 |S|\le 3 ∣ S ∣ ≤ 3 时显然成立,当 ∣ S ∣ > 3 |S|>3 ∣ S ∣ > 3 时取出 S S S 中最长的连续相同子串,不妨假设它是 n n n 个 a a a ,分两种情况讨论:
n ≥ 4 n \ge 4 n ≥ 4 ,直接将前两个 a a a 合并,∣ S ∣ |S| ∣ S ∣ 减小了 1 1 1 ,并且还满足引理条件。
n ≤ 3 n\le 3 n ≤ 3 ,由于 ∣ S ∣ > 3 |S|>3 ∣ S ∣ > 3 ,这个子串不可能前后都没有字母,不妨假设它不在开头,那么它前面必然是 b b b ,将前两个 a a a 合并成 b b b ,那么此时有两个 b b b 会相邻,∣ S ∣ |S| ∣ S ∣ 减小了 1 1 1 ,并且还满足引理条件。
然后问题就转化成了有多少个串 T T T 满足以下条件:
存在一种将 S S S 划分为 ∣ T ∣ |T| ∣ T ∣ 段的方式,使得每一段与 T T T 中的对应字母满足引理一。
这个问题的主要难点在于引理一的条件二。
事实上,当 S S S 中有相邻的相同字母时,忽略引理一的条件二 不会影响答案。
引理二:若 S S S 中有相邻的相同字母,S S S 能够变成 T T T 当且仅当:
存在一种将 S S S 划分为 ∣ T ∣ |T| ∣ T ∣ 段的方式,设 S S S 被划分成了 S 1 , S 2 , ⋯ , S ∣ T ∣ S_1,S_2,\cdots,S_{|T|} S 1 , S 2 , ⋯ , S ∣ T ∣ ,T T T 中每个字母分别为 T 1 , T 2 , ⋯ , T ∣ T ∣ T_1,T_2,\cdots,T_{|T|} T 1 , T 2 , ⋯ , T ∣ T ∣ 。
满足 ∀ i , p ( S i ) = p ( T i ) \forall i,p(S_i)=p(T_i) ∀ i , p ( S i ) = p ( T i ) 。
必要性显然,下面证明充分性:
假设存在一组满足上述条件的划分 ( S 1 , S 2 , ⋯ , S ∣ T ∣ ) (S_1,S_2,\cdots,S_{|T|}) ( S 1 , S 2 , ⋯ , S ∣ T ∣ ) 。
将 S 1 , S 2 , ⋯ , S ∣ T ∣ − 1 S_1,S_2,\cdots,S_{|T|-1} S 1 , S 2 , ⋯ , S ∣ T ∣ − 1 的长度最小化得到新的划分 ( S 1 ′ , S 2 ′ , ⋯ , S ∣ T ∣ ′ ) (S_1',S_2',\cdots,S_{|T|}') ( S 1 ′ , S 2 ′ , ⋯ , S ∣ T ∣ ′ ) 。
由于最小化,容易发现 S 1 , S 2 , ⋯ , S ∣ T ∣ − 1 S_1,S_2,\cdots,S_{|T|-1} S 1 , S 2 , ⋯ , S ∣ T ∣ − 1 已经满足了引理一。
此时 S ∣ T ∣ S_{|T|} S ∣ T ∣ 有可能不合法,比如 S ∣ T ∣ = a b a b ⋯ a b a S_{|T|}=abab\cdots aba S ∣ T ∣ = a b a b ⋯ a b a ,由于不合法时 ∣ T ∣ > 1 |T|>1 ∣ T ∣ > 1 ,可以让 S ∣ T ∣ S_{|T|} S ∣ T ∣ 只保留最后一个字母,把前面的部分扔给 S ∣ T ∣ − 1 S_{|T|-1} S ∣ T ∣ − 1 ,于是 T T T 删去最后一个字母对于 S S S 删去最后一个字母满足引理二,故 S S S 可以变成 T T T 。
有了引理二就很好做了,特判掉 S S S 中没有相邻的相同字母的情况,容易用一个自动机来判断 T T T 是否合法,计数可以在自动机上 DP。
复杂度 O ( n ) O(n) O ( n ) 。
如何判定当前的卷心菜是否能满足所有公司?
S S S 向卷心菜 i i i 连容量为 A i A_i A i 的边。
公司 i i i 向 T T T 连容量为 B i B_i B i 的边。
如果 c i , j = 1 c_{i,j}=1 c i , j = 1 ,那么卷心菜 i i i 向公司 j j j 连容量为 ∞ \infty ∞ 的边。
max f l o w = ∑ i = 1 m B i \max flow=\sum_{i=1}^mB_i max f l o w = ∑ i = 1 m B i 。
也等价于 T T T 的所有入边不是最小割。由于 S S S 的出边很少,考虑枚举最小割中有哪些 S S S 的出边,假设这些边为 m a s k mask m a s k ,割掉 m a s k mask m a s k 后有一些 T T T 的入边就不需要割了,假设这些边的容量和为 s u m sum s u m ,那么需要吃点的卷心菜数量就是 ∑ i ∈ m a s k A i − s u m + 1 \sum_{i\in mask}A_i-sum+1 ∑ i ∈ m a s k A i − s u m + 1 ,要求 s u m > 0 sum>0 s u m > 0 。
这时就可以解决第一问了,考虑对于所有 m a s k mask m a s k ,怎么求它们的 s u m sum s u m ,注意到 B i B_i B i 贡献给 m a s k mask m a s k 的条件是 m a s k mask m a s k 包含所有能供应给公司 i i i 的卷心菜,可以用子集前缀和 (FMT) 求出。然后枚举 m a s k mask m a s k 用 ∑ i ∈ m a s k A i − s u m + 1 \sum_{i\in mask}A_i-sum+1 ∑ i ∈ m a s k A i − s u m + 1 更新第一问的答案即可。
第二问还要进一步分析,为了不算重,我们枚举一个 m a s k mask m a s k 表示被吃的卷心菜品种的集合,一个 m a s k mask m a s k 可行当前仅当存在一个取到第一问答案的 S S S ,使得 m a s k ⊆ S mask\subseteq S m a s k ⊆ S ,这个同样可以用 FMT 做。设第一问答案为 a n s ans a n s ,最后是对于一个 m a s k mask m a s k ,求有多少种从 m a s k mask m a s k 中吃掉 a n s ans a n s 个卷心菜的方式,满足 m a s k mask m a s k 中的每种卷心菜至少被吃一个。容易想到容斥,钦定一些卷心菜品种不吃,然后不考虑每种卷心菜必吃的限制,但对每个 m a s k mask m a s k 都通过容斥来计算复杂度高达 O ( 3 n ) O(3^n) O ( 3 n ) 。
设 f S f_S f S 表示有多少种从 S S S 中吃掉 a n s ans a n s 个卷心菜的方式,满足 m a s k mask m a s k 中的每种卷心菜至少被吃一个,发现
∑ T ⊆ S f T = ( ∑ i ∈ S A i a n s ) \sum_{T\subseteq S}f_T=\binom{\sum_{i\in S}A_i}{ans}
T ⊆ S ∑ f T = ( a n s ∑ i ∈ S A i )
对右边做 IFMT 就可以求得 f f f 数组。
复杂度 O ( n 2 n + n m ) O(n2^n+nm) O ( n 2 n + n m ) 。
先考虑对于一个串 S S S 如何单独计算答案,这个不难,容易想到用区间 DP 做。设 f l , r f_{l,r} f l , r 表示子串 [ l , r ] [l,r] [ l , r ] 的改写方案数,转移分两种:
s l s_l s l 没有参与改写,贡献为 f l + 1 , r f_{l+1,r} f l + 1 , r 。
s l s_l s l 参与改写了,枚举最外层的覆盖 s l s_l s l 的改写:周期 T T T 和循环次数 i > 1 i>1 i > 1 ,如果合法,则贡献为 f l , l + T − 1 ⋅ f l + T i , r f_{l,l+T-1}\cdot f_{l+Ti,r} f l , l + T − 1 ⋅ f l + T i , r 。
当尝试用区间 DP 做原问题的时候,发现做不了,因为当 s l s_l s l 参与改写时,原来的 f l , l + T − 1 f_{l,l+T-1} f l , l + T − 1 不再是一个区间的 DP 值。详细地说,设 f ( s ) f(s) f ( s ) 表示字符串 s s s 的答案(子集的改写方案数总和),设 s u f ( i ) suf(i) s u f ( i ) 表示 s s s 从 s i s_i s i 开始的后缀,转移为两种:
第一个字符没有参与改写,贡献为 ( s 0 + 1 ) f ( s u f ( 1 ) ) (s_0+1)f(suf(1)) ( s 0 + 1 ) f ( s u f ( 1 ) ) 。
第一个字符参与了,枚举最外层的覆盖 s l s_l s l 的改写:周期 T T T 和循环次数 i > 1 i>1 i > 1 ,由于每个周期内要相等,所有子集的限制要叠加,设 s [ l , r ] s[l,r] s [ l , r ] 表示 s s s 的第 l l l 个字符到第 r r r 个字符的子串,设
t = s [ 0 , T − 1 ] & s [ T , 2 T − 1 ] & ⋯ & s [ T ( i − 1 ) , T i − 1 ] ( & i s bitand ) t=s[0,T-1]\&s[T,2T-1]\&\cdots\&s[T(i-1),Ti-1](\&\ is\ \text{bitand})
t = s [ 0 , T − 1 ] & s [ T , 2 T − 1 ] & ⋯ & s [ T ( i − 1 ) , T i − 1 ] ( & i s bitand )
那么贡献为 f ( t ) ⋅ f ( s u f ( T i ) ) f(t)\cdot f(suf(Ti)) f ( t ) ⋅ f ( s u f ( T i ) ) 。
这里的复杂度上限看起来是 O ( 2 n + 1 ) O(2^{n+1}) O ( 2 n + 1 ) ,这个题最重要的地方就是,你要看出来这个做法其实是 O ( O( O ( 能过) ) ) 的,进而分析出其真正的复杂度,而不是被假上限给吓跑了。
下面证明,有一个上界是 O ( n 3 + 2 n 8 ) O(n^3+2^{\frac n8}) O ( n 3 + 2 8 n ) 。首先长度小于等于 n 8 \frac n8 8 n 的串最多有 2 n 8 2^{\frac n8} 2 8 n 个,长度大于等于 n 8 \frac n8 8 n 的串最多被压缩两次(因为每压缩一次长度减半),只有三种压缩方式:
先选择一个子段划分成 2 2 2 段,再选择一个子段划分成 2 2 2 段。
先选择一个子段划分成 2 2 2 段,再选择一个子段划分成 3 3 3 段。
先选择一个子段划分成 3 3 3 段,再选择一个子段划分成 2 2 2 段。
显然第一种压缩方式可以得到的串是最多的,考虑第一种压缩方式得到的串是怎样的,形如:
s [ a , a + k − 1 ] & s [ a + k , a + 2 k − 1 ] & s [ b , b + k − 1 ] & s [ b + k , b + 2 k − 1 ] s[a,a+k-1]\&s[a+k,a+2k-1]\&s[b,b+k-1]\&s[b+k,b+2k-1] s [ a , a + k − 1 ] & s [ a + k , a + 2 k − 1 ] & s [ b , b + k − 1 ] & s [ b + k , b + 2 k − 1 ]
显然它是由 a , b , k a,b,k a , b , k 三个参数决定的,故数量是 O ( n 3 ) O(n^3) O ( n 3 ) ,因此三种压缩方式的总和也是 O ( n 3 ) O(n^3) O ( n 3 ) 。
另外,通过打表可以求出长度大于 12 12 1 2 的串更为精准的上界为 41703 41703 4 1 7 0 3 。