AcWing 1230. K倍区间
给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K倍区间。
你能求出数列中总共有多少个 K倍区间吗?
输入格式
第一行包含两个整数 N和 K。
以下 N行每行包含一个整数 Ai。
输出格式
输出一个整数,代表 K倍区间的数目。
数据范围
1≤N,K≤100000,
1≤Ai≤100000
输入样例:
5 2
1
2
3
4
5
输出样例:
6
代码实现:
#include<iostream>
using namespace std;
#define int long long
const int N=1e5+5;
//cnt[i]数组表示余数为i的序列的个数
int a[N],b[N],cnt[N];
signed main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i]+b[i-1];
}
//b[r]%k == b[l-1]%k
//由于l从1开始,所以l-1从0开始,但是r从1开始
int res=0;
for(int i=0;i<=n;i++){
res += cnt[b[i] % k];
cnt[b[i] % k] ++;
}
cout<<res<<endl;
return 0;
}