洛谷 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;
}
posted @ 2025-03-17 01:34  Yuhhhhh  阅读(66)  评论(0)    收藏  举报