题目

image-1667380730457

题解

这里cnt[i]用来表示模k的余数为i的个数,当s左右区间的余数都为i的时候,那么此时两个左右区间的之差就为0,就为K的倍数。

#include<iostream>
using namespace std;
const int N=100010;
long long s[N],cnt[N];
int n,k;
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        scanf("%lld",&s[i]);
        s[i]+=s[i-1];   
    }
    long long ans=0;
    cnt[0]=1;
    for(int i=1;i<=n;i++){
        ans+=cnt[s[i]%k];
        cnt[s[i]%k]++;
    }
    cout<<ans<<endl;
    
    return 0;
}