P9049 [PA 2021] Mopadulo 题解

题意简述

现在你有一个长度为\(n \in [1,3\times 10^5]\)的序列\(a\) 问有多少种方法可以将序列\(a\)划分为诺干个区间,使得每个区间内所有数的和模\(10^9+7\)为偶数

思考

显然,这个题目我们考虑动态规划

设$$f[i]$$代表前\(i\)项的合法分割方案数

对于初始状态,我们有\(f[0]=1\)

我们定义$$sum(l,r)=(\sum_{i=l}^{r}a[i]) \bmod 10^9+7$$

我们有

\[f[i]=\sum_{j|sum(j,i) \equiv 0 \pmod 2 }f[j] \]

这是一个\(O(n^2)\)的做法.

我们考虑优化

我们研究一下\(j\)的条件.

要求和模\(1e9+7\)是一个偶数

由于\(1e9+7\)是一个奇数.

当这个和除上\(1e9+7\)为偶数的时候, 模完和的奇偶性不变

当和除上\(1e9+7\)为奇数的时候,模完和的奇偶性反转.

但是这好像没啥用,因为它没有简化我们枚举\(j\)的过程

那么我们就要从前缀和考虑.

我们设\(s[i]\)代表\(a\)的\([1,i]\)位置的和. 处于方便,我们设\(p=1e9+7\)

那么区间取模就可以使用\((s[i]-s[j-1])\bmod p=(s[i] \bmod p -s[j-1] \bmod p+p) p\)

我们设\(s'[x]=s[x] \bmod p\)

那么就变成了\((s'[i] -s'[j-1]+p) p\)

我们研究一下这个式子

我们考虑\(s'[i]>=s'[j-1]\)的时候. 那么在经过这个式子运算后,奇偶性显然不变

也就是说我们要找\(j\)使得\(s[i]\)与\(s[j-1]\)相同奇数偶数的.

我们考虑\(s'[i]<s'[j]\)的时候. 那么在经过这个式子运算后,奇偶性显然取反.

也就是说我们要找\(j\)使得\(s[i]\)与\(s[j-1]\)不同奇数偶数的.

然后这个显然是可以线段树维护的.

我们使用线段树存储状态.下标为\(s[j-1]\),值为\(dp[j]\)

posted @ 2026-10-04 20:58  txp2025  阅读(3)  评论(0)    收藏  举报