目录

前缀和的例题

前缀和的例题

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