P3131 [USACO16JAN]Subsequences Summing to Sevens S
sum统计余数。如果[l,r]能被7整除,那么sum[r]和sum[l-1]的余数一定相同,然后找每个余数最前的位置和最后的位置,枚举余数统计max。
注意sum[0]=0的边界。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=50005;
int n;
int a[N],sum[N];
int last[N],first[N];
int maxl;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) sum[i]=(sum[i-1]+a[i])%7;
for(int i=0;i<=n;i++){
last[sum[i]]=i;
}
for(int i=n;i>=0;i--){
first[sum[i]]=i;
}
for(int i=0;i<=6;i++){
maxl=max(maxl,last[i]-first[i]);
}
printf("%d",maxl);
return 0;
}