K倍區間 字首和 變形

2021-09-26 06:59:49 字數 1002 閱讀 1173

題目:

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

45樣例輸出

6首先想到的肯定是列舉每個區間,將每個區間做和,如果不用字首和,妥妥地n的3次方的解法,超時是肯定的;在輸入的時候,可以o(n)的記錄s【i】為前i項的和,那麼求i到j區間的和直接可以用是s[j]-s[i-1]快速得到;複雜度降為n的2次方,發現還是超時,題目中的資料n最大是100000;所以nlogn的解法都未必行。

只能另尋它路,我們判斷的是(s[j]-s[i-1])%k=0,則是k倍區間;將此處變形;是s[j]%k==s[i-1]%k,則是k倍區間也就是當前的對k取模後的值發現在前面出現過,則一定是個k倍區間;

注意:1:時間複雜度o(n)

2:用cnt陣列記錄每個模結果的數量;

3:res記錄答案,型別為long long ;

執行後,發現答案為4;不是6;

發現當模為0的時候會出現問題;例子:

1 0 2 0 0

這5個數是前i項和的取模結果,如果到前4項,結果為0,res不能只加一,雖然前面只有乙個0,但是它自己

本身就是k的倍數,所以被漏掉;結束後答案應加上cnt;

#include using namespace std;

const int n=1000005;

int f[n];long long s[n]=;long long res=0;

int cnt[n]=;

int main()

cout

}

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