k倍區間(字首和)

2021-10-03 05:04:05 字數 972 閱讀 2681

題目如下

解題思路

這個思路實在太強了

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.有的人可能對**的最後一段不太懂

1.首先咋們的目的是找出字首和%k相同的數即組成了sum[r]%k == sum[l-1]%k ,即是乙個,所以當n個模k的數相同,那麼k倍區間的數目就是c(n,2),然後為什麼最後要加bk[0] 呢,因為bk[0]乙個就可以直接單獨代表k倍區間,當然**不理解理解了我所闡述的也可以換種寫法。因為c(n,2)也可以直接計算。

3.要保證時間複雜度。

4、此時間複雜度為o(n).

**如下

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

ll bk[

100010

],arr[

100010];

ll k,n;

intmain()

arr[0]

= arr[0]

%k; ll sum =0;

for(

int i =

1; i < n; i++

)for

(int i =

0; i < n; i++

) cout<<

(sum + bk[0]

)<<

'\n'

;return0;

}

K倍區間 字首和

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

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

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 輸出乙...