K倍区间

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

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

输入格式

第一行包含两个整数 NN 和 KK。

以下 NN 行每行包含一个整数 AiAi。

输出格式

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

数据范围

1N,K1000001≤N,K≤100000,
1Ai1000001≤Ai≤100000

输入样例:

5 2
1
2
3
4
5

输出样例:

6


#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
using ll = long long;
const int N = 1e5+10;
int dp[N],sum[N];
int main()
{
    ll ans=0;
    int n,m;
    scanf("%d%d", &n, &m);
    for (int i = 1, x; i <= n; i ++ ){
        scanf("%d", &x);
        sum[i]=(sum[i-1]+x)%m;
        ans+=dp[sum[i]];
        dp[sum[i]]++;
    }
    printf("%lld",ans+dp[0]);
}

  

(a+b) % p = (a%p + b %p) %p
(a%p + b) % p = (a%p%p + b %p) %p = (a+b) %p,
同理可得:
(a+b+c) %p = ((a%p + b) %p + c) %p

posted @ 2021-05-21 14:47  Acception  阅读(145)  评论(0)    收藏  举报