题目描述
小明玩一个游戏。 系统发1+n
张牌,每张牌上有一个整数。 第一张给小明,后n
张按照发牌顺序排成连续的一行。
需要小明判断,后n
张牌中,是否存在连续的若干张牌,其和可以整除小明手中牌上的数字。
输入描述
输入数据有多组,每组输入数据有两行,输入到文件结尾结束。
第一行有两个整数n
和m
,空格隔开。m
代表发给小明牌上的数字。
第二行有n
个数,代表后续发的n
张牌上的数字,以空格隔开。
输出描述
对每组输入,如果存在满足条件的连续若干张牌,则输出1
;否则,输出0
。
备注
1`` ``≤`` ``n`` ``≤`` ``1000
1`` ``≤ 牌上的整数 ≤`` ``400000
- 输入的数组,不多于
1000
- 用例确保输入都正确,不需要考虑非法情况。
示例一
输入
6 7
2 12 6 3 5 5
输出
1
思路
假设连续子数组nums[i:j]
的和为A
,由前缀和的定义可知
A = pre_sum_lst[j] - pre_sum_lst[i]
假设A
是符合题意的连续子数组和(此时应该输出1
作为结果),那么存在
A % m == 0
成立,即
(pre_sum_lst[j] - pre_sum_lst[i]) % m == 0
成立。打开括号并移项,可以得到
pre_sum_lst[j] % m == pre_sum_lst[i] % m
成立。
因此,我们只需要找到两个前缀和pre_sum_lst[i]
和pre_sum_lst[j]
,能够满足上述式子,就可以说明存在符合题意的连续子数组了。
n, m = map(int, input().split())
nums = list(map(int, input().split()))
pre_sum_set = set()
pre_sum_set.add(0)
pre_sum = 0
isFind = False
for num in nums:
pre_sum += num
if pre_sum % m in pre_sum_set:
isFind = True
break
pre_sum_set.add(pre_sum % m)
print(int(isFind))