抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

传送门

为什么你们的题解都写得这么长。

考虑前缀和,设a[i]a[i]的前缀和数组为sum[i]sum[i],则我们有i=xya[i]=sum[y]sum[x1]\sum _{i=x} ^y a[i]=sum[y]-sum[x-1],因为i=xya[i]mod7=0\sum _{i=x} ^y a[i] \mod 7 = 0,所以我们有sum[y]sum[x1]mod7=0sum[y]-sum[x-1] \mod 7= 0,即sum[y]sum[y]sum[x1]sum[x-1]77同余。

考虑贪心,我们设last[i]=min{j,sum[j]mod7=i}last[i]=\min \{ j , sum[j] \mod 7 = i\},就可以求出模77意义下离现在位置yy最远的xx,满足sum[x1]sum[x-1]sum[y]sum[y]同余,就可以搞定了。

记得每步都%7,要不然可能会爆int\rm int

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
#define MAXN 500005
using namespace std;
int a[MAXN],last[7];
int main(){
int n;
scanf("%d",&n);
for (register int i=1;i<=n;++i) scanf("%d",&a[i]);
memset(last,0x3f,sizeof(last));
int ans=0;
for (register int i=1;i<=n;++i){
a[i]=(a[i]+a[i-1])%7;
ans=max(ans,i-last[a[i]]);
last[a[i]]=min(last[a[i]],i);
}
printf("%d\n",ans);
}

评论