hdu4648Magic Pen 6

http://acm.hdu.edu.cn/showproblem.php?pid=4648

求连续的一段和对m取余为0  若s[j]和s[i]对M的余数都相同 则相见就满足要求 找个最长的

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define LL long long

 8 #define N 100010

 9 #define INF 0xfffffff

10 LL s[N];

11 int a[N],d1[N],d2[N];

12 int main()

13 {

14     int i,j,n,m,k;

15     while(cin>>n>>m)

16     {

17         memset(s,0,sizeof(s));

18         LL sum=0;

19         for(i = 1; i <= m ; i++)

20         {

21             d1[i] = -INF;

22             d2[i] = INF;

23         }

24         int ans=0;

25         for(i = 1; i <= n ; i++)

26         {

27             scanf("%d",&a[i]);

28             sum+=a[i];

29             s[i] = s[i-1]+a[i];

30             k = s[i]%m;

31             if(k<0) k+=m;

32             if(k==0)

33             ans = max(ans,i);

34             d1[k] = max(d1[k],i);

35             d2[k] = min(d2[k],i);

36         }

37         for(i = 1; i < m ; i++)

38         ans = max(d1[i]-d2[i],ans);

39         cout<<ans<<endl;

40     }

41     return 0;

42 }
View Code

 

你可能感兴趣的:(HDU)