歷屆試題 k倍區間

2021-09-11 23:04:36 字數 1392 閱讀 8261

題目

問題描述

給定乙個長度為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樣例輸出

方法:字首和 取模 

**

#include#includeusing namespace std;

long long input[100010],show[100010];

int main()

long long ans=0;

for(int i=0;i注意點

1 每次都取模然後求字首和,簡化計算

2 用乙個show陣列存放字首和 

1 2 3 4 5的字首和為 1 1 0 0 1 那麼show[0]=2,show[1]=3;

show陣列從0到k-1 因為mod k之後最大是k-1 

3 在存放完字首和後就需要計算結果了

我們需要注意到 字首和相同的兩個位置i,j (比如示例中的1和5兩個數字),

那麼就好辦了 我們已經通過show陣列記錄了各種字首和的數量

還需要加上字首和等於0的那些數量 得到結果

4 可能講的大家聽不太明白 我就按示例演示一遍吧

5 21 2 3 4 5 

可以求得字首和陣列 input[1]=1  input[2]=1  input[3]=0  input[4]=0  input[5]=1

然後我們得到字首和結果陣列show[0]=2 show[1]=3;

也就是說字首和等於0的有2個 等於1的有3個

然後看等於1的這些位置 1 2  5

那麼可以看出這三個位置任意選兩個組合,他們中間的數之和就是字首和

(1和2 中間(i,j]  也就是2 ; 1和5中間(i,j] 也就是2345 ; 2和5 中間也就是345  )

所以我們得到結論 從每種字首和中任取兩個都是k倍區間

那麼怎麼計算呢 其實就是排列組合

然後我們注意到這樣計算完之後ans=4,這是因為我們少了show[0]的區間;

歷屆試題 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 ...

歷屆試題 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 ...

歷屆試題 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 ...