[USACO16JAN] Subsequences Summing to Sevens S
题目描述
Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a traumatic childhood incident involving the numbers 1 … 6 1 \ldots 6 1…6, he only wants to take a picture of a group of cows if their IDs add up to a multiple of 7.
Please help FJ determine the size of the largest group he can photograph.
给你n个数,分别是a[1],a[2],…,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],…,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
输入格式
The first line of input contains N N N ( 1 ≤ N ≤ 50 , 000 1 \leq N \leq 50,000 1≤N≤50,000). The next N N N
lines each contain the N N N integer IDs of the cows (all are in the range
0 … 1 , 000 , 000 0 \ldots 1,000,000 0…1,000,000).
输出格式
Please output the number of cows in the largest consecutive group whose IDs sum
to a multiple of 7. If no such group exists, output 0.
样例 #1
样例输入 #1
7
3
5
1
6
2
14
10
样例输出 #1
5
提示
In this example, 5+1+6+2+14 = 28.
思路
题目有要求整除,因此我们就改成模数,在预处理前缀和的时候预处理出模数。然后我们只要判断 s j = s i − 1 , 1 ≤ i , j ≤ n s_j=s_{i-1},1\leq i,j\leq n sj=si−1,1≤i,j≤n在此,我们可以进行相应的优化:
- 优化1:题目要求求出最大的,我们可以把ans放在for循环上,只有当
ans<j-i+1
时,我们才更新ans
。
代码
#include<cstdio>
#define int long long
using namespace std;
const int N = 5e5+10;
int s[N],n;
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%lld",&x);
s[i]=(s[i-1]+x)%7;
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+ans+1;j<=n;j++){//因为是最长的区间,所以+ans
if(s[j]==s[i-1]){
if(ans>=j-i+1)break;
ans=j-i+1;
}
}
}
printf("%lld",ans);
return 0;
}