看到这一题第一印象就是暴力好打,$O(n^2)$,预计得分$70$分
这明显满足不了啊,我们要用到前缀和。
$sum[i]$记录到i的前缀和,区间$[a,b]$的和就是$sum[b]-sum[a-1]$.
处理完以后怎么统计呢,$n^2$当然不行,我们要用到一个显然的定理。
如果 $aequiv c(mod$ $k)$并且$bequiv c(mod$ $k)$,那么$|a-b|equiv 0(mod$ $k)$
显然两个数的余数在相减的时候同时减去,从而只剩下$k$的倍数。
所以题目里我们只需要考虑每个前缀和$mod$ $7$的余数,若余数相等那么$sum[i]$ $mod$ $7=0$,所以我们只需要记录一下每个余数第一次出现的位置和最后一次出现的位置,相减的出答案(至少出现两次哦)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> using namespace std; int n,a[50010],sum[50010],ans,k,f[10]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; sum[i]%=7; } for(int i=1;i<=n;i++) { if(!f[sum[i]])f[sum[i]]=i; else ans=max(ans,i-f[sum[i]]); } printf("%d",ans); }