acwing评测地址:https://www.acwing.com/problem/content/description/1232/
解析:
很容易想到前缀和。但是n*n很明显不行
对于[L,R],如果为k的倍数那么:
(sumR-sumL-1)%k==0
那么sumR%k==sumL-1%k
但是这么写的话,会忽略掉前缀和为0的情况:1~i 和%k==0
所以末尾加上就好了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
int main()
{
int n,k;
map<int,int>mp;
cin>>n>>k;
int sum = 0;
ll ans = 0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum=(sum+a[i])%k;
ans+=mp[sum];
mp[sum]++;
}
cout<<ans+mp[0]<<endl;
}