第八屆藍橋杯 K 倍區間

2021-10-04 16:43:02 字數 1670 閱讀 3786

問題描述

給定乙個長度為 n 的數列,a1, a2, … an,如果其中一段連續的子串行 ai, ai+1, … aj 之和是 k 的倍數,

我們就稱這個區間 [i, j] 是k倍區間,你能求出數列中總共有多少個 k 倍區間嗎?

輸出格式

第一行包含兩個整數 n 和 k。(1 ≤ n, k ≤ 100000)

以下 n 行每行包含乙個整數 ai。(1 ≤ ai ≤ 100000)

輸出格式

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

樣例輸入

5 2123

45樣例輸出

6題解一:

字首和(會超時):官網能得到28%的分數

#include

#include

#include

#include

using

namespace std;

const

int n =

100010

;int a[n]

;int

main()

int ans =0;

for(

int i = n; i >=

1; i --

)for

(int j =

1; j <= i; j ++)if

((a[i]

- a[i - j]

)% k ==

0) ans ++

;// 求k倍區間

cout << ans << endl;

return0;

}

題解二

字首和 & 數學:

答案會爆int

若每個數字本身就是 k 的倍數,最多有 105 個數,每個數最大為 105,因此字首和的最大值為 1010;

若每個數字本身就是 k 的倍數,每個數兩兩配對,最多有 105 × (105 - 1) / 2 ≈ 5 × 1010;

解題思路

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

100010

;int n, k;

ll s[n]

, cnt[n]

;// cnt[x] 表示餘數 x 出現了幾次

intmain()

ll res =0;

cnt[0]

=1;// 若某區間本身為 k 的倍數,應該直接加上它,因此先讓 cnt[0] = 1;

for(

int i =

1; i <= n; i ++

)printf

("%lld\n"

, res)

;return0;

}

ps:

第八屆藍橋杯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...

第八屆藍橋杯 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倍區間)

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