前缀和的例题
lanqiao OJ 97
题目描述
给定一个长度为 NN 的数列,A1,A2,⋯ANA1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai+1,⋯AjAi,Ai+1,⋯Aj ( i≤ji≤j ) 之和是 KK 的倍数,我们就称这个区间 [i,j][i,j] 是 K 倍区间。
你能求出数列中总共有多少个 KK 倍区间吗?
输入描述
第一行包含两个整数 NN 和 KK( 1≤N,K≤1051≤N,K≤105 )。
以下 N 行每行包含一个整数 AiAi ( 1≤Ai≤1051≤Ai≤105 )
输出描述
输出一个整数,代表 K 倍区间的数目。
输入输出样例
示例
输入
5 2
1
2
3
4
5
输出
6
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5+5;
ll a[N];
ll ans[N];
int n,k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++){
ans[a[i]%k]++;
}
ll sum=ans[0];
for(int i=0;i<k;i++){
sum+=(ans[i]*(ans[i]-1))/2;
}
cout<<sum;
return 0 ;
}