给你n个数,分别是a[1],a[2],...,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
做这个题目需要知晓一个定理:若两个数相减后除以n的余数等于零,那么这两个数分别除以n的余数一定相同。那么思路就很明显了,我们可以反过来应用这个定理,把前缀和求出之后全部除以7保留余数,那么余数相同的两个前缀和相减除以7的余数就等于0,也就是可以被7整除。
#include<iostream>
using namespace std;
#define N 1000100
int n,q[N],pre[7],las[7];//pre数组用来记录余数在数组第一次出现的位置,las数组记录最后一次出现的位置
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i];
q[i]=(q[i]+q[i-1])%7;
}
for(int i=1;i<=n;i++)//从头到尾遍历,那么最后一次更新的位置就会被记录在las数组中,也就是余数最后一次出现的位置
las[q[i]]=i;
for(int i=n;i>=0;i--)//从尾到头遍历,那么最后一次更新的位置就会被记录在pre数组中,也就是余数第一次出现的位置
pre[q[i]]=i;
int maxn=0;
for(int i=1;i<7;i++)
maxn=max(las[i]-pre[i],maxn);
cout<<maxn;
return 0;
}