問題描述思路:要求的是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 <= 100000)
輸出格式
輸出乙個整數,代表k倍區間的數目。
樣例輸入
5 21 2 3 4 5
樣例輸出
6資料規模和約定
那這裡我們肯定得做取餘運算了,如果餘數為0當然是k的倍數了 那麼餘數不為0就不是k的倍數,
但是 仔細想一想 兩個區間對k的取餘結果相同,比如餘數都為1時,此時這兩個區間相減之後的
區間就是k的倍數了,但然這裡不用擔心,因為每次取到的都是連續的區間,所以減出來的區間也是連續的。
這裡用到了sum來存餘數x對應這個有y個區間,對於每種不同的區間他們的數量就是c(n,2),
就是n個里取兩個相減,當然這裡有特殊,就是餘數為0的情況需要額外加1 因為 比如說s5就是k的倍數,他不需要減什麼區間,但是在我們的運算中是要取到兩個區間,所以要額外加1 相當於加了個 和為0的區間s0
#include
intmain()
; sum[0]
=0;long
long ans=0;
scanf
("%ld%ld"
,&n,
&k);
for(i=
1;i<=n;i++
)scanf
("%ld"
,&s)
,sum[i]
=sum[i-1]
+s;
js[0]
=1;for
(j=1
;j<=n;j++
)js[sum[j]
%k]++
;for
(i=0
;i(js[i]
)ans+
=(js[i]
*(js[i]-1
))/2
;//c(n,2) 從 眾多區間裡選兩個 都可構成
printf
("%lld\n"
,ans)
;return0;
}
藍橋杯 歷屆試題 k倍區間 c語言
k倍區間 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,...
藍橋杯 歷屆試題 k倍區間
題目 歷屆試題 k倍區間 時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數...
藍橋杯 歷屆試題 k倍區間
時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,k 100...