歷屆試題 k倍區間 (字首和)

2021-09-22 21:06:27 字數 1332 閱讀 1089

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