Loading

AcWing 1230. K倍区间

题目链接:

https://www.acwing.com/problem/content/1232/

题解:

这个公式最重要s[r] - s[l-1] % k == 0 等价于 s[r]%k == s[l-1] % k

意思就是说,只要s[n]和s[m]模k的值一样,他们必然可以组成一个k倍区间

边界问题:s[0] = 1;

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
const int N = 100010;

int a[N];
ll sum[N];
int cnt[N];

int main(void){
    int n,k;
    cnt[0] = 1;
    scanf("%d%d",&n,&k);
    long long res = 0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum[i] += sum[i-1]+a[i];
    }
    
    for(int i=1;i<=n;i++){
        res += cnt[sum[i] % k];
        cnt[sum[i] % k]++;
    }
    
    printf("%lld",res);
    return 0;
}

 

posted @ 2020-02-07 19:06  Doubest  阅读(102)  评论(0编辑  收藏  举报