第八屆藍橋杯 K倍區間

2021-09-13 10:43:01 字數 855 閱讀 1476

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

2  3  

4  5  

程式應該輸出:

6原先想過是否可以用尺取法,但是區間數的加和不滿足單調性,因此無法使用尺取法

emm,拿到題的第二反應就是把它劃分成同餘類,但是接下來怎麼優化也沒啥想法學習了乙個比較巧妙的想法,區間和肯定是要用字首和處理的

講的很清楚的參考部落格

學到了:如果要在一堆數中找到兩兩相同的個數(有點生日攻擊(╥﹏╥)的趕腳),可以開個陣列記錄在自己之前和自己一樣的數的個數,直接在答案上加上去 (本題有序) 感覺這個思路還是很巧妙的,從把問題轉化為mod k同餘,再到找個數

#includeusing namespace std;

const int n=1e5+10;

typedef long long ll;

ll a[n];

ll sum[n];

ll cnt[n]; //cnt[i]表示在當前位置之前有幾個數和自己mod k同餘

int n,k;

int main()

第八屆藍橋杯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 之和是 k 的倍數,我們就稱這個區間 i,j 是k倍區間,你能求出數列中總共有多少個 k 倍區間嗎?輸出格式 第一行包含兩個整數 n 和 k。1 n,k 100000 以下 n 行每行包含乙個整數...

第八屆藍橋杯省賽(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 輸出乙...