6780. 2020.08.06【NOI2020】模拟T1 歪比歪比

题目

题目描述很简洁,所以直接copy下来。

求有多少有序的序列对 ( A , B ) (A, B) (A,B),满足:

  1. A A A, B B B 中的元素要么是 1 1 1, 要么是 − m −m m;
  2. A A A, B B B − m −m m 的总个数为 n n n;
  3. A A A 中的元素和为 S A SA SA, B B B 中的元素和为 S B SB SB;
  4. A A A, B B B 中任意位置的前缀和都大于 0 0 0。 并对 998244353 998244353 998244353 取模。

n m ≤ 1 e 7 nm\le 1e7 nm1e7

S A , S B ≤ 5 e 6 SA,SB\leq 5e6 SA,SB5e6

正解

大结论题……

先考虑一个子问题:假设我们知道一个序列的中有 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 prejprei,由上面的第(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} ij(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 ij(modr) i ≤ r i\le r ir,可以发现 l s t j lst_j lstj l s t j − l e n lst_j-len lstjlen对应的循环同构串是相同的,并且 l s t j − l e n lst_j-len lstjlen会是 l s t j − r lst_{j-r} lstjr的一个候选,所以 l s t j − r ≥ l s t j − l e n lst_{j-r}\ge lst_j-len lstjrlstjlen;反过来 l s t j − r + l e n lst_{j-r}+len lstjr+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 lstjlstjr+len。于是 l s t j lst_j lstj可以被 l s t j − r lst_{j-r} lstjr替代,最终可以得到 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 nx − 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)搞定。

猜你喜欢

转载自blog.csdn.net/A1847225889/article/details/107879103
今日推荐