P3131 [USACO16JAN] Subsequences Summing to Sevens S
https://www.luogu.com.cn/problem/P3131算法:前缀和
思路
O(N^2)的复杂度降低为O(N)
(a - b) % k = 0 ==> a % k = b % k
从上面的公式我们可以得出一个结论:余数相同的两个数,其差能被 k 整除

C++代码
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 5e4 + 10;
int n,m;
int a[N],s[N];
int pre[7],post[7];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n ;
for(int i = 1; i <= n; i++){
cin >> a[i];
s[i] = (s[i-1] + a[i]) % 7; //前缀和存7的余数
}
s[0] = 0;
for(int i = n; i >= 0; i--){ //倒序,找余数为 i 的第一个位置
pre[s[i]] = i;
}
for(int i = 0 ; i <= n; i++){
post[s[i]] = i; //正序,找余数为 i的最后一个位置
}
int ans = 0;
//7的倍数 因此余数是从0~7
for(int i = 0; i < 7; i++){
ans = max(ans,post[i] - pre[i]);
}
cout << ans ;
return 0;
}