#1157. 最大子段和 (sum)

最大子段和 (sum)

题目描述

给定一个长度为 nn 的整数序列 a1,a2,,ana_1, a_2, \dots, a_n,其中 0ai<p0 \le a_i < p

请选择一个连续区间 al,al+1,,ara_l, a_{l+1}, \dots, a_r1lrn1 \le l \le r \le n),使得该子段和对 pp 取模的结果尽可能大。

形式化地,你需要最大化:

(i=lrai)modp\left( \sum_{i=l}^{r} a_i \right) \bmod p

其中 mod\bmod 表示取模运算。输出这个最大值。

输入格式

第一行包含两个整数 nnpp,分别表示序列长度和模数。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n,表示给定的序列。

输出格式

输出一行一个整数,表示最大可能的子段和对 pp 取模的结果。

样例输入 1

3 10
3 5 7

样例输出 1

8

样例输入 2

4 7
2 3 1 4

样例输出 2

6

说明

样例解释

对于样例 22,选择整个序列 [2,3,1,4][2, 3, 1, 4],和为 101010mod7=310 \bmod 7 = 3。选择子段 [2,3][2, 3],和为 55。选择子段 [3,4][3, 4],和为 777mod7=07 \bmod 7 = 0。选择子段 [1,4][1, 4],和为 55。选择子段 [2,3,1][2, 3, 1],和为 666mod7=66 \bmod 7 = 6。因此最大值为 66

其它样例说明

  • 样例 3:见选手目录下的 sum/sum3.insum/sum3.ans,该测试用例满足测试点 181 \sim 8 的约束条件。
  • 样例 4:见选手目录下的 sum/sum4.insum/sum4.ans,该测试用例满足测试点 9129 \sim 12 的约束条件。
  • 样例 5:见选手目录下的 sum/sum5.insum/sum5.ans,该测试用例满足测试点 131613 \sim 16 的约束条件。
  • 样例 6:见选手目录下的 sum/sum6.insum/sum6.ans,该测试用例满足测试点 172017 \sim 20 的约束条件。

数据范围

对于 100%100\% 的数据,满足以下约束条件:

  • 1n2×1051 \le n \le 2 \times 10^5
  • 1p1091 \le p \le 10^9
  • 0ai<p0 \le a_i < p

各测试点的附加限制如下表所示:

测试点编号 nn \le 特殊性质
181 \sim 8 50005000
9129 \sim 12 2×1052 \times 10^5 aip\sum a_i \le p
131613 \sim 16 p100p \le 100
172017 \sim 20

点击下载大样例