首页 > 其他 > 详细

K倍区间

时间:2021-05-21 17:58:28      阅读:13      评论:0      收藏:0      [点我收藏+]

给定一个长度为 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

K倍区间

原文:https://www.cnblogs.com/qq1415584788/p/14793753.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!