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