题目
题目描述很简洁,所以直接copy下来。
求有多少有序的序列对 ( A , B ) (A, B) (A,B),满足:
- A A A, B B B 中的元素要么是 1 1 1, 要么是 − m −m −m;
- A A A, B B B 中 − m −m −m 的总个数为 n n n;
- A A A 中的元素和为 S A SA SA, B B B 中的元素和为 S B SB SB;
- A A A, B B B 中任意位置的前缀和都大于 0 0 0。 并对 998244353 998244353 998244353 取模。
n m ≤ 1 e 7 nm\le 1e7 nm≤1e7
S A , S B ≤ 5 e 6 SA,SB\leq 5e6 SA,SB≤5e6
正解
大结论题……
先考虑一个子问题:假设我们知道一个序列的中有 n n n个 − m -m −m,和为 r r r,显然它的长度 l e n len len为 n ( m + 1 ) + r n(m+1)+r n(m+1)+r。
接下来有个神奇的结论:对于任意一个序列 A A A,它的 n ( m + 1 ) + r n(m+1)+r n(m+1)+r个循环同构串中,恰好有 r r r个是合法的。
复述一下题解的神秘证明:
将序列重复无数次,得到序列 A 1 … ∞ A_{1\dots\infty} A1…∞。记前缀和 p r e n = ∑ i = 1 n A i pre_n=\sum_{i=1}^nA_i pren=∑i=1nAi
记 l s t n = max p r e i = n i lst_n=\max_{pre_i=n}i lstn=maxprei=ni。 l s t n lst_n lstn一定存在:(1)序列每重复一次,前缀和就会总体加 r r r,所以到后面无限远的地方就不会再出现 p r e i = n pre_i=n prei=n了;(2)并且由于每次加的操作都是 + 1 +1 +1,所以前缀和是由若干个连续的单调递增的序列组成的。由这两点就可以证明它一定存在。
接下来找到 l s t i ( i ∈ [ 1 , r ] ) lst_i(i\in[1,r]) lsti(i∈[1,r]),可以发现 [ l s t i , l s t i + l e n ) [lst_i,lst_i+len) [lsti,lsti+len)一定是一段合法的序列:如果中间出现了一处 j j j使得 p r e j ≤ p r e i pre_j\le pre_i prej≤prei,由上面的第(2)点得,这时候 l s t i lst_i lsti一定可以被 j j j或 j j j后面的某个位置所替代,矛盾。由此我们证明了这些序列的合法性。
现在证明它们恰好就是合法的区间且不重复。对于 i ≠ j i\neq j i=j,如果 [ l s t i , l s t i + l e n ) [lst_i,lst_i+len) [lsti,lsti+len)和 [ l s t j , l s t j + l e n ) [lst_j,lst_j+len) [lstj,lstj+len)对应原序列的循环同构串相同,则一定有 i ≡ j ( m o d r ) i\equiv j \pmod {r} i≡j(modr)。根据其逆否命题, i ∈ [ 1 , r ] i\in [1,r] i∈[1,r]对应的所有区间对应原序列的循环同构串都不相同。于是证明了至少有 r r r个合法的区间。
如果有 j j j满足 r < j r<j r<j,设 i ≡ j ( m o d r ) i\equiv j \pmod r i≡j(modr)且 i ≤ r i\le r i≤r,可以发现 l s t j lst_j lstj和 l s t j − l e n lst_j-len lstj−len对应的循环同构串是相同的,并且 l s t j − l e n lst_j-len lstj−len会是 l s t j − r lst_{j-r} lstj−r的一个候选,所以 l s t j − r ≥ l s t j − l e n lst_{j-r}\ge lst_j-len lstj−r≥lstj−len;反过来 l s t j − r + l e n lst_{j-r}+len lstj−r+len也是 l s t j lst_j lstj的一个候选,所以 l s t j ≥ l s t j − r + l e n lst_j\geq lst_{j-r}+len lstj≥lstj−r+len。于是 l s t j lst_j lstj可以被 l s t j − r lst_{j-r} lstj−r替代,最终可以得到 l s t j lst_j lstj和 l s t i lst_i lsti对应的循环同构串是相同的。
于是答案为: ( l e n n ) r l e n \binom{len}{n} \frac{r}{len} (nlen)lenr
接下来考虑求两个串的贡献。朴素的想法是枚举 A A A序列有 x x x个 − m -m −m,枚举 B B B序列有 n − x n-x n−x个 − m -m −m。
但实际上可以将两个序列合并成一个大序列,找到最后一个位置 r r r,满足 [ 1 , r ] [1,r] [1,r]的和为 S A SA SA, [ r + 1 , l e n ] [r+1,len] [r+1,len]的和为 S B SB SB。这样是唯一对应一组 A A A和 B B B的。
于是答案为: ( n ( m + 1 ) + S A + S B n ) S A + S B n ( m + 1 ) + S A + S B \binom{n(m+1)+SA+SB}{n}\frac{SA+SB}{n(m+1)+SA+SB} (nn(m+1)+SA+SB)n(m+1)+SA+SBSA+SB
预处理阶乘之后每个询问直接 O ( 1 ) O(1) O(1)搞定。