第八屆藍橋杯省賽(K倍區間)

2021-08-16 17:01:22 字數 1345 閱讀 9904

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

資源約定:峰值記憶體消耗(含虛擬機器) < 256mcpu消耗  < 2000ms請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

注意:main函式需要返回0;只使用ansi c/ansi c++ 標準;不要呼叫依賴於編譯環境或作業系統的特殊函式。所有依賴的函式必須明確地在原始檔中 #include 不能通過工程設定而省略常用標頭檔案。提交程式時,注意選擇所期望的語言型別和編譯器型別。

這個題就是找區間是k的倍數的個數,假設陣列區間[l,r],規定sum[i]是i=l到r的和,(sum[j]-sum[i])%k==0,j=i,能轉化為sum[j]%k==sum[i]%k;

說明能找的對k取餘相同的兩個區間就能組成乙個滿足條件的區間,我們用cou[i]來記錄模為x的個數,模為下標;

數列        1    2    3    4    5           mod=2    t=0;

sum        1    3    6    10   15

sum%2    1    1    0    0     1

t            +0   +1  +0   +1  +2

此時t=4但是答案是6,因為區間對k取余為零就滿足條件,sum[i]%k==0;也滿足不要忘記,加上cou[0]就行了。

#include#include#includeusing namespace std;

int sum[100001],num[100001],cou[100001];

int main()

printf("%d\n",t+cou[0]);

return 0;

}

第八屆藍橋杯k倍區間

題目 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 100000 ...

第八屆藍橋杯 K 倍區間

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