点击打开链接
题意:
给你n个数,要求删去最多连续的数字,使剩下的数对m的余数不变。
可以想到使删去的连续数字和为m的倍数就可以了。也就是去最长连续和是的m的倍数。
可以求出A[i],表示从第一个数到第i个数的和对m的余数,
当出现同余的时候,两个同余之间的数肯定是m的倍数,
注意处理负数,先对输入的数%m,在(..+m)%m,
还要处理余数为0的情况,这时候要单独判断。
#include"stdio.h" #include"string.h" #define N 10005 int A[N]; int main() { int a; int n,m; int i,t; int ans; while(scanf("%d%d",&n,&m)!=-1) { memset(A,-1,sizeof(A)); t=0; ans=0; for(i=1;i<=n;i++) { scanf("%d",&a); a%=m; a=(a+m)%m; t+=a; t%=m; if(t==0) { if(i>ans)ans=i; continue; } if(A[t]!=-1) { if(i-A[t]>ans)ans=i-A[t]; } else A[t]=i; } printf("%d\n",ans); } return 0; }