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