2013 多校第五场 hdu 4648 Magic Pen 6

来源:互联网 发布:广富宝网络借贷 编辑:程序博客网 时间:2024/06/05 03:31

题目: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;}