題目如下
解題思路
這個思路實在太強了
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 輸出乙...