#include using namespace std; const int N = 1000010; #define int long long int n, p; // n个小朋友,对p取模 int num[N]; // 记录每个小朋友的数字 int tz[N]; // 记录每个小朋友的特征值 int score[N]; // 记录每个小朋友得分 int calc(int x) { // 求1-x区间最大连续子序列的和 // 每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中 // 连续若干个(最少有一个)小朋友手上的数字之和的最大值。 int ans = num[1]; for (int i = 1; i <= x; i++) // 开始 for (int j = i; j <= x; j++) { // 结束 int sum = 0; // 枚举区间,求和并打擂台 for (int k = i; k <= j; k++) sum += num[k]; ans = max(ans, sum); } return ans; } signed main() { // 加快读入 ios::sync_with_stdio(false), cin.tie(0); cin >> n >> p; // 读入每个小朋友的数字 for (int i = 1; i <= n; i++) cin >> num[i]; // 计算每个小朋友的特征值 for (int i = 1; i <= n; i++) tz[i] = calc(i); // 计算每个小朋友的分数 score[1] = tz[1]; // 第一个小朋友的分数是他的特征值 int mx = tz[1] + score[1]; // mx用来记录当前最大特征值与分数和 for (int i = 2; i <= n; i++) { score[i] = mx; mx = max(mx, tz[i] + score[i]); } int ans = score[1]; for (int i = 2; i <= n; i++) ans = max(ans, score[i]); cout << ans % p << endl; }