藍橋杯 歷屆試題 k倍區間

2021-09-12 08:49:42 字數 1275 閱讀 6450

時間限制:2.0s   記憶體限制:256.0mb

問題描述

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

資料規模和約定

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 2000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

題目思路:就是用字首和來寫,注意連續的子串行是指數組中的一段數,不需要排序。

這裡用這個來表示**中cnt陣列的作用 

求k倍區間的個數就涉及到組合數學的知識了,

所以我們已知第三排陣列有3個0和3個1的情況下,可以直接用組合數求出來k倍區間的數目:c(3,2)+c(3, 2)=6。c(3, 2)是指從3個物品裡取出2個來的組合數。因為有3個0和3個1,所以答案就是c(3, 2)+c(3, 2)。

把上面統計的思路歸納一下,就是:計算字首和s[0], s[1], s[2], … s[n]。統計s中模k餘0, 1, 2 … k-1的數量,記為cnt[0], cnt[1], cnt[2] … cnt[k-1]。答案就是:cnt[0]*(cnt[0]-1)/2 + cnt[1]*(cnt[1]-1)/2 +… +cnt[k-1]*(cnt[k-1]-1)/2。

上**:

#include#includeusing namespace std;

int main()

for(int i=0;i

cout<

return 0;

}

藍橋杯 歷屆試題 k倍區間

題目 歷屆試題 k倍區間 時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數...

藍橋杯 歷屆試題 k倍區間 c語言

k倍區間 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,...

藍橋杯 歷屆試題 K倍區間數(C語言)

問題描述 給定乙個長度為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...