- 和可被 K 整除的子数组
这种涉及到字串之和的应该联想到前缀和。
如果存在 和的余数 相同的两个字串,那么将长串减去短串得到的串可被K整除。
因此假如 具有相同余数r的子串有n个,那么用长减短可以得到 :
n
−
1
+
n
−
2
+
.
.
.
+
2
+
1
=
n
(
n
−
1
)
/
2
n-1 + n-2 + ... + 2 + 1=n(n-1)/2
n−1+n−2+...+2+1=n(n−1)/2个可被K整除的字串
请注意 和的余数为0 的子串有空串。
一边统计一边算
func subarraysDivByK2(A []int, K int)(ans int ){
sum:=0
rec:=make(map[int]int)
rec[0]++
for _,v:=range A{
sum+=v
r:=(sum%K+K)%K
ans+=rec[r]
rec[r]++
}
return ans
}
统计完了再算
func subarraysDivByK(A []int, K int)(ans int ){
sum:=0
rec:=make(map[int]int)
rec[0]++
for _,v:=range A{
sum+=v
r:=(sum%K+K)%K
rec[r]++
}
for _,v:=range rec{
ans+=v*(v-1)/2
}
return ans
}