AcWing 1230. K倍区间

发布时间 2023-03-30 14:45:41作者: 回忆、少年

给定一个长度为 N 的数列,A1,A2,AN,如果其中一段连续的子序列 Ai,Ai+1,Aj 之和是 K 的倍数,我们就称这个区间 [i,j]K倍区间。

你能求出数列中总共有多少个 K倍区间吗?

输入格式

第一行包含两个整数 NK

以下 N行每行包含一个整数 Ai

输出格式

输出一个整数,代表 K倍区间的数目。

数据范围

1N,K100000,
1Ai100000

输入样例:

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