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; }