提交时间:2026-10-29 16:37:41
运行 ID: 43435
#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; }