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