hdu4648Magic Pen 6

时间:2023-03-09 16:53:08
hdu4648Magic Pen 6

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

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

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define LL long long
#define N 100010
#define INF 0xfffffff
LL s[N];
int a[N],d1[N],d2[N];
int main()
{
int i,j,n,m,k;
while(cin>>n>>m)
{
memset(s,,sizeof(s));
LL sum=;
for(i = ; i <= m ; i++)
{
d1[i] = -INF;
d2[i] = INF;
}
int ans=;
for(i = ; i <= n ; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
s[i] = s[i-]+a[i];
k = s[i]%m;
if(k<) k+=m;
if(k==)
ans = max(ans,i);
d1[k] = max(d1[k],i);
d2[k] = min(d2[k],i);
}
for(i = ; i < m ; i++)
ans = max(d1[i]-d2[i],ans);
cout<<ans<<endl;
}
return ;
}