K倍区间
给定一个长度为 N的数列,A1,A2,...An,如果其中一段连续的子序列 Ai,Ai+1,…AjAi,Ai+1,…Aj 之和是 KK 的倍数,我们就称这个区间 [i,j][i,j] 是 KK 倍区间。
你能求出数列中总共有多少个 KK 倍区间吗?
输入格式
第一行包含两个整数 NN 和 KK。
以下 NN 行每行包含一个整数 AiAi。
输出格式
输出一个整数,代表 KK 倍区间的数目。
数据范围
1≤N,K≤1000001≤N,K≤100000,
1≤Ai≤1000001≤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

浙公网安备 33010602011771号