字首和 藍橋杯省賽 K倍區間

2021-10-02 17:32:53 字數 3190 閱讀 2945

題目:

給定乙個長度為 n 的數列,a1,a2,…an,如果其中一段連續的子串行 ai,ai+1,…aj 之和是 k 的倍數,我們就稱這個區間 [i,j] 是 k 倍區間。

你能求出數列中總共有多少個 k 倍區間嗎?

輸入格式

第一行包含兩個整數 n 和 k。

以下 n 行每行包含乙個整數 ai。

輸出格式

輸出乙個整數,代表 k 倍區間的數目。

資料範圍

1≤n,k≤100000,

1≤ai≤100000

輸入樣例:

5 2123

45輸出樣例:

6題意:

輸 入區

間長度n

,整數k

,輸入區間長度n,整數k,

輸入區間長度

n,整數

k,輸 入n

個數,問

長度為n

的區間中

,有多少

個子區間

的區間和

是k的倍

數。

輸入n個數,問長度為n的區間中,有多少個子區間的區間和是k的倍數。

輸入n個數,

問長度為

n的區間

中,有多

少個子區

間的區間

和是k的

倍數。

題解:

對 區間

和問題的

處理,考

慮字首和

。對區間和問題的處理,考慮字首和。

對區間和問題

的處理,

考慮字首

和。

ll sum[n]

;//字首和陣列

ll ans=0;

for(

int r=

1;r<=n;r++

)for

(int l=

1;l<=r;l++)if

((sum[r]

-sum[l-1]

)%k==

0) ans++

;

列舉區

間的左右

端點l和

r,看區

間和模k

是否為0

,時間復

雜度o(

n2),

tle。

列舉區間的左右端點l和r,看區間和模k是否為0,時間複雜度o(n^2),tle。

列舉區間的左

右端點l

和r,看

區間和模

k是否為

0,時間

複雜度o

(n2)

,tle。考慮

能否優化

掉乙個循

環:

考慮能否優化掉乙個迴圈:

考慮能否優化

掉乙個循

環: 事實上

,第二層

迴圈是計

算:前r

−1項前

綴和當中

與前r項

和同餘的

個數

事實上,第二層迴圈是計算:前r-1項字首和\ 當中與\ 前r項和\ 同餘的個數

事實上,第二

層迴圈是

計算:前

r−1項

字首和當

中與前r

項和同餘

的個數

所 以我

們開乙個

cnt[

n]陣列

,來儲存

餘數為i

的字首和

的個

數所以我們開乙個cnt[n]陣列,來儲存餘數為i的字首和的個數

所以我們開一

個cnt

[n]數

組,來存

儲餘數為

i的字首

和的個數每枚

舉乙個r

,答案就

加上cn

t[su

m[r]

%k](

表示在前

r−1項

和中餘數

為sum

[r]%

k的個數

),再更

新cnt

[sum

[r]%

k]++

,表示當

前列舉的

第r項前

綴和

。每列舉乙個r,答案就加上cnt[sum[r]\%k](表示在前r-1項和中餘數為sum[r]\%k的個數),\\再更新cnt[sum[r]\%k]++,表示當前列舉的第r項字首和。

每列舉乙個r

,答案就

加上cn

t[su

m[r]

%k](

表示在前

r−1項

和中餘數

為sum

[r]%

k的個數

),再更

新cnt

[sum

[r]%

k]++

,表示當

前列舉的

第r項前

綴和。

時 間復

雜度o(

n)

。時間複雜度o(n)。

時間複雜度o

(n)。

for

(int i=

1;i<=n;i++

)

**:

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int maxn=

1e5+5;

int n,k;

ll cnt[maxn]

;//cnt[i]表示餘數為i的數的個數

ll sum[maxn]

;ll ans;

intmain()

cnt[0]

=1;///初始狀態下,區間和為0的sum[0]已有1個

for(

int i=

1;i<=n;i++

)printf

("%lld\n"

,ans)

;return0;

}

藍橋杯 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倍區間(字首和)

資源限制 時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,...

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 輸出乙...