洛谷 P3131 [USACO16JAN] Subsequences Summing to Sevens S(前缀和+模运算性质)
做题历程
拿到手的时候就是考虑前缀和,毕竟要求区间和,如果暴力做就是N3,那么就开始做,写了个O(n2)复杂度代码,交上去80分...迷了,心想这题难道dp啊,懒得想的我直接看题解,发现大佬用了一个很简单的模运算性质就过去了,即(a - b) mod 7 == 0 那么 a = b (mod 7)。但是真有大佬dp做的。那么根据大佬说的这个性质直接写代码,就过去了。
AcCode:
#include<bits/stdc++.h>
using namespace std;
long long sum[50010], vis[7];
int main(){
int N, maxLength = 0;
memset(vis, -1, sizeof(vis));
cin >> N;
for(int i = 1; i <= N; i++){
cin >> sum[i];
sum[i] = sum[i] + sum[i - 1];
}
for(int i = 0; i <= N; i++){
int path = sum[i] % 7;
if(vis[path] == -1) vis[path] = i; //记录第一个mod7的值的位置
else{
if(i - vis[path] > maxLength) maxLength = i - vis[path]; //往后找,更新最长区间
}
}
cout << maxLength;
return 0;
}