给定一个长度为 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
原文:https://www.cnblogs.com/qq1415584788/p/14793753.html