| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 43435 | 范墨涵 | 【J】T3 | C++ | 解答错误 | 90 | 284 MS | 29612 KB | 939 | 2026-10-29 16:37:41 |
#include<bits/stdc++.h> using namespace std; #define int long long const int N = 1e6+10; int n,p; int a[N]; int sum[N]; int pre[N]; // pre[i]表示第i个往前最靠后的与它前缀和相等的下标 int f[N]; // f[i]表示1~i合并后的结果,f[i]=max(f[i-1],f[pre[i]]+1); signed main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); cin >> n >> p; for (int i=1;i<=n;i++){ cin>>a[i]; sum[i]=a[i]; sum[i]=(sum[i]+sum[i-1])%p; } memset (pre,-1,sizeof(pre)); for (int i=n;i>=2;i--){ for (int j=i-1;j>=1;j--){ if (sum[i]==sum[j]){ pre[i]=j; break; } } } if (sum[1]==0) f[1]=1; else f[1]=0; for (int i=2;i<=n;i++){ f[i]=f[i-1]; if (pre[i]==-1) continue; f[i]=max(f[i],f[pre[i]]+1); } cout << f[n]; return 0; }