2017藍橋杯k倍區間問題

2021-08-15 19:30:43 字數 1254 閱讀 6537

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

1 2

3 4

5 程式應該輸出:

6資源約定:

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

cpu消耗 < 2000ms

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

注意:

main函式需要返回0;

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

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

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

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

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

一看是連續子串行求【i,j】區的問題就應該想到是字首和的問題,sum[i] 表示是a1+a2+…..+ai 的和,那麼對於區間[i,j]之間的和就是sum[j]-sum[i-1]。要求是k的倍數,則(sum[j]-sum[i-1])%k==0 轉化為 sum[j]%k==sum[i-1]%k 所以在求字首和的時候就可以進行求模運算,然後比如樣例中得到的字首和求完模後的結果為

1 1 0 0 1 那麼下面就統計其中相同的資料,用數學角度分析的話 3個1 有3種組合

,2個0有一種組合,這是考慮的是相減的情況,然而本身其求模後為0也有兩種情況,那麼就是3+1+2=6 。數學角度轉化就是轉化成**借用bk陣列進行統計而已

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=10010;

ll bk[maxn]=;

ll arr[maxn];

ll n,k;

int main()

for(int i=0;iprintf("%lld\n",sum+bk [0]);

return

0;}

2017藍橋杯 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 10...

2017藍橋杯 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 輸出乙...

藍橋杯 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 10...