演算法 k倍區間(字首和)

2021-10-18 17:46:56 字數 829 閱讀 3906

利用字首和可以快速計算出乙個區間的值,然後利用字首和的取餘相同時,相減之後就會等於0,說明如果有k個具有相同餘數的區間的話,就能有(k-1)+(k-2)+…+1個區間滿足的情況。cnt[0]++是因為如果s[i]取餘的值為0時,就相當於從總區間的左端點到i的區間滿足情況,所以應該提前加上cnt[0]++

給定乙個長度為 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 2123

45輸出樣例:

6

#include

using

namespace std;

const

int n =

100010

;typedef

long

long ll;

ll s[n]

, cnt[n]

;int

main()

ll ans =0;

cnt[0]

++;for(

int i =

1; i <= n;

++i)

cout << ans << endl;

}

原題鏈結

K倍區間 字首和

第二天叫醒我的不是鬧鐘,是夢想!題目描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入 第一行包含兩個整數n和k。1 n,k 100000 以下n行每行...

k倍區間(字首和)

題目如下 解題思路 這個思路實在太強了 1.sum i 代表a 0 a i 1 的和,那麼sum r sum l 1 即為區間 l,r 之間的和,即求 sum r sum l 1 k 0,即求sum r k sum l 1 k 即先求出字首和。在求出字首和的同時 k。2.有的人可能對 的最後一段不太...

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 a...