题目描述:
数学家小 Q 得到了一个长度为 n 的数列 {an}。
小 Q 的幸运数字是 k,所以他认为,若一个子数列 al, al+1, …, ar 的和为 k 的倍数,则该子数列是优美子数列。
小 Q 现在想考考你,{an} 里有多少个优美子数列呢?
输入格式:
第一行输入两个正整数 n,k。
接下来一行输入 n 个数,代表 a1 到 an。
输出格式:
输出一行一个正整数,表示优美子数列的个数。
样例输入:
5 3
1 2 3 4 5
样例输出:
7
数据规模:
对于 60% 的数据,n≤1000;
对于 100% 的数据,1≤n≤2×105,1≤k≤107,-109≤ai≤109。
代码如下
#include<bits/stdc++.h>
using namespace std;
long long k,n,ans,a;
long long b[200005];
map<int,int>c;
int main()
{
cin>>n>>k;c[0]=1;
for(int i=1;i<=n;i++){
scanf("%lld",&a);
b[i]=(b[i-1]+a%k)%k;
ans+=c[b[i]]++;
}printf("%lld",ans);return 0;
}