k倍区间

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

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

输入
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)

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

例如,
输入:
5 2
1
2
3
4
5

程序应该输出:
6

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

通过前缀和加取模,

然后要知道一个东西就是,只要前缀出现同样的就得累加,

也就是一个累计数组。

而且累计数组考虑的不包括本身,所以最后要吧取摸为零的加进去。

 

 1 #include <iostream>
 2 #define N 100000
 3 #define ll long long int
 4 using namespace std;
 5 ll an[N], bn[N];
 6 int n, k;
 7 
 8 int main(){
 9     cin >> n >> k;
10     for(int i = 1; i <= n; i++ ){
11         cin >> an[i];
12         an[i] %= k;
13     }
14     for(int i = 1; i <= n; i++){
15         an[i] = (an[i] + an[i-1])%k;
16     }
17     ll sum = 0;
18     for(int i = 1; i <= n; i++){
19         sum += (bn[an[i]]++);
20     }
21     cout << sum + bn[0] << endl;
22     return 0;
23 }

 

posted @ 2019-03-22 15:16  #忘乎所以#  阅读(252)  评论(0编辑  收藏  举报