給定乙個長度為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
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
做一道題,首先要先看看題目中給出的資料的範圍,(整數n和k:(1 <= n, k <= 100000),整數ai:(1 <= ai <= 100000)),這個範圍雙層for就要炸了,所以一定要去找到乙個合適的方法去處理這道題。
由題目中的這句話:「a1, a2, ... an,如果其中一段連續的子串行ai, ai+1, ... aj(i <= j)之和是k的倍數」,我們可以知道,乙個數字也可以構成乙個區間。
這道題要求區間和是k的倍數,那麼字首和是一定要用的,這樣可以減少很多求和的運算量,當然取模也要用,不然long long 存不下;
用乙個陣列儲存下來取餘後的數值的結果,當兩個數值一樣時,那麼這個區間肯定可以構成k的整數倍(腦子不好用,想了好久才想到,當兩個數值相等時,相減肯定是0,那麼這個區間的和肯定就是k的倍數,腦子不行了還想了半天)。
當然要注意,當它自己本身就是0(即是k的整數倍),那麼這個區間就它乙個元素,和也是k的整數倍,也是一種情況,最後記得一定要加上。
#include#include#includeusing namespace std;
int n,m;
int a[100010],b[100010],c[100010];
// 數值 字首和 取餘後和為i的個數;
int main()
printf("%lld\n",sum+c[0]);//記得加上自己可以構成乙個區間的情況;
}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 ...
歷屆試題 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 ...