K倍区间


给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K倍区间。
你能求出数列中总共有多少个 K倍区间吗?
输入格式
第一行包含两个整数 N和 K。
以下 N行每行包含一个整数 Ai。
输出格式
输出一个整数,代表 K倍区间的数目。
数据范围
1≤N,K≤100000,1≤Ai≤100000
输入样例:
5 2
1
2
3
4
5
输出样例:
6

#include<iostream>
#include<algorithm>
using namespace std;
long long aa[1234567];
long long ss[1234567];
int main()
{
    int n,m;
    cin>>n>>m;
    long long res=0;
    for(int i=1;i<=n;i++) cin>>aa[i];
    for(int i=1;i<=n;i++)
    {
        aa[i]=(aa[i]+aa[i-1])%m;
        ss[aa[i]%m]++;
    }
    res+=ss[0];
    for(int i=0;i<m;i++)
       res+=ss[i]*(ss[i]-1)/2;
    cout<<res<<endl;
    return 0;
}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
四平方和 四平方和
题目四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多 4个正整数的平方和。如果把 0包括进去,就正好可以表示为 4个数的平方和。比如:5=0^ 2 +0^2 +1 ^2+2 ^27=1 ^2+1 ^2+1 ^2+2 ^2对于一个
2020-02-23
Next 
二分 二分
二分模板有两个 当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。 while (l < r) {
2020-02-23
  TOC