题目:http://acm.hdu.edu.cn/showproblem.php?pid=4648
题目大意:就是给你一个n个数的序列,让你求能被m整除的连续的一段数的最大长度。
思路:用sum[ i ]表示前i项和,那么连续的一段[ i , j ]就可以表示为sum[ j ] - sum[ i - 1 ],也就是sum[ j ]%m - sum[ i - 1 ]%m ==0 最大,那么我们对于每个余数k记录它的最左边的位置和最右边的位置,减一下就是最大长度了。这里还要注意,mod为0的位置最左边位置应该为0,没有数mod算是0.
比赛的时候竟然想了一个小时都没想出来,无语。。= =
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mod1[11111],mod2[11111];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(mod1,-1,sizeof(mod1));
memset(mod2,-1,sizeof(mod2));
int sum = 0 ;
int a;
for(int i = 1;i<=n;i++)
{
scanf("%d",&a);
sum += a;
int t = (sum%m+m)%m;
if(mod1[t]==-1)
mod1[t] = i;
mod2[t] = i;
}
int ans = 0;
mod1[0]=0;
for(int i = 0;i<=m;i++)
{
if(mod1[i]!=-1)
ans = max(ans,mod2[i]-mod1[i]);
}
printf("%d\n",ans);
}
return 0;
}