给定一个长度为 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
AC代码:
#include<stdio.h>
int n,k;
long long s[100010];
int m[100010];
long long ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)//求前缀和
{
scanf("%lld",&s[i]);
s[i]+=s[i-1];
}
m[0]=1;//s[0]模k为0
for(int i=1;i<=n;++i)//区间右端点r固定为i,讨论左端点l
{
//只要s[r]和s[l]模k相同,[l+1,r]必为k倍区间
//找到在s[r]之前的所有满足条件的s[l]即可
ans+=m[s[i]%k];
++m[s[i]%k];
}
printf("%lld",ans);
return 0;
}