k倍区间
Posted zllwxm123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于k倍区间的主要内容,如果未能解决你的问题,请参考以下文章