藍橋杯2017初賽 k倍區間 字首和

2022-05-03 12:21:19 字數 1284 閱讀 7869

題目描述

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

345

樣例輸出

6

題解:首先暴力判斷一定會超時的,

如果區間[l,r]的和(sum[r]-sum[l])%k==0,那麼sum[r]%k==sum[l]%k,

所以只要判斷有幾個字首和%k的值相等,即可以判斷幾個區間和%k==0

用樣例舉個例子:

sum[1]%2==1       此時vis[1]==0,所以ans=ans+vis[1]=0     vis[1]=1

sum[2]%2==1  此時vis[1]==1,所以ans+ans+vis[1]=1     vis[1]=2

sum[3]%2==0  此時vis[0]==0,所以ans=ans+vis[0]=1           vis[0]=1

sum[4]%2==0  此時vis[0]==1,所以ans=ans+vis[0]=2      vis[0]=2

sum[5]%2==1  此時vis[1]==2,所以ans=ans+vis[1]=4      vis[1]=3

這個時候ans=4,這裡統計的是區間(1,n]之間的子區間和%k==0的區間個數,還要加上[1,n]之間區間和%k==0的個數(以樣例為例是區間[1,3]和[1,4])

所以ans=6

注意ans用long long

#include#include

#include

#include

#include

#define ll long long

using

namespace

std;

int a[100005],sum[100005],vis[100005

];int

main()

cout

<0]

}

藍橋杯2017初賽 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 100...

藍橋杯2017初賽 k倍區間 (字首和)

已知a那麼我們就可以將字首和模k的值為0,1,2 k 1的區間數分別求出來,然後分別計算。例如字首和模k為1的區間有x個。那麼就可以產生c x,2 個k倍區間 即x x 1 2個 然後對0 k 1分別進行此操作並求和。此題的關鍵是要知道 當兩個數的餘數相同時,這兩個數的差的餘數為0!include ...

2017藍橋杯 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 輸出乙...