思路
前缀和用于解决区间问题,可以快速求解某个区间的和
如果某个区间的和为 k 的倍数,则左右端点在前缀和数组中的值模上 k 的结果是一样的,所以可以使用哈希表或者数组记录前缀和数组中每个值模上 k 的结果的数目。统计时注意初始情况,即以数组初始位置为左端点的区间,设置 count[0] = 1
例如:n = 1, k = 2, nums = [6],如果不设置 count[0] = 1 则返回结果0,因为不设置的话初始的 count[0] = 0
由于不需要使用前缀和数组中具体的数值,所以使用变量 t 记录当前前缀和即可。
代码
n, k = map(int, input().split())
nums = []
for i in range(n):
nums.append(int(input()))
count = [0] * k
count[0] = 1 # 补充初始情况
ans = t = 0
for i in range(n):
t += nums[i]
ans += count[t % k]
count[t % k] += 1
print(ans)