藍橋杯 PREV 40 k倍區間

2021-09-12 02:50:06 字數 1110 閱讀 5703

歷屆試題 k倍區間  

時間限制: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

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

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

分析:求區間的和與k的關係,用到字首和。因為題目資料規模十分巨大,若用雙重迴圈解決問題便會超時。由雙重迴圈時的判斷式(sum[r] - sum[l - 1]) % k == 0,可得sum[r] % k == sum[l - 1] % k。因此在計算字首和時,便計算sum[i] % k的值並計數,每有乙個相等且之前出現的值出現,區間數便加一。之後再加上所有滿足要求的從0開始的區間(即sum[i] % k == 0)的數量。

**:

#include#include#include#includeusing namespace std;

int main()

mapm;

long long ans = 0;

for (int i = 1; i <= n; i++)

cout << ans + m[0] << endl;

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

藍橋杯 K倍區間

時間限制 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 以...

藍橋杯 k倍區間

暴力模擬 雙迴圈肯定超時了,需要找到數字間的規律進行優化 includeusing namespace std typedef long long ll define maxn 100005 sum r sum l 1 就是區間 l,r 的和。區間 l,r 的和是k的倍數即 sum r sum l ...