藍橋杯 歷屆試題 K倍區間數(C語言)

2022-10-11 02:09:08 字數 1336 閱讀 7706

問題描述   

給定乙個長度為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資料規模和約定

思路:要求的是k的區間 而且是任意起點都可以,也就是隨便擷取區間只要是k的倍數即可。

那這裡我們肯定得做取餘運算了,如果餘數為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...