题目描述
给出一个长度为 n 的序列,找出一个区间和被 7 整除,要求这个区间长度最
长。
输入格式
第一个是数字 N
接下来 N 行是 N 个数字
输出格式
输出最大的长度, 如果不存在输出 0
样例输入
7 3 5 1 6 2
14
10
样例输出
5
数据规模
30%数据 N<=100
100%数据 N<=50000
本蒟蒻爆int只有80……
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
#define rep_(i,a,b) for(int i=(a);i>=(b);i--)
#define _for(i,a,b) for(int i=(a);i<(b);i++)
int n;
const int N=5e4+10;
int mod[N],first[N],last[N],cnt=0;
ll sum[N];
int a[N],len;
int vis[10];
int main()
{
//freopen("seven.in","r",stdin);
//freopen("seven.out","w",stdout);
scanf("%d",&n);
memset(vis,0,sizeof(vis));
_rep(i,1,n)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
_rep(i,1,n)
{
sum[i]%=7;
if(!vis[sum[i]])
{
vis[sum[i]]=1;
mod[cnt++]=sum[i];
first[sum[i]]=i;
}
}
memset(vis,0,sizeof(vis));
rep_(i,n,1)
{
if(!vis[sum[i]])
{
if(sum[i]==0)len=i;
last[sum[i]]=i;
vis[sum[i]]=1;
}
}
_for(i,0,cnt)
if(mod[i]!=0)
len=max(len,last[mod[i]]-first[mod[i]]);
printf("%d\n",len);
return 0;
}