华为OD机考双机位C卷 - 卡牌游戏 (Java & Python & JS & GO & C++ & C)
卡牌游戏
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
小明正在尝试一种新的牌游戏。游戏规则如下:首先,小明拿到一张写有数字 m 的牌。 然后,他会拿到另外 n 张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m 整除。你的任务是判断小明是否可以完成这个目标。
输入描述
第一行包含两个整数:n 和 m。其中 n 是小明拿到的牌的数量(不包括写有 m 的牌),m 是写在第一张牌上的数字。
第二行包含 n 个整数,这些整数分别是 n 张牌上的数字。
输出描述
如果小明可以找到一个连续的牌串,这些牌上数字的和可以被 m 整除,输出 “1”。 如果找不到符合条件的牌串,输出 “0”。
示例1
输入
6 7
2 12 6 3 5 5
输出
1
说明
示例2
输入
10 11
1 1 1 1 1 1 1 1 1 1
输出
0
说明
解题思路
核心思想
本题要求判断是否存在连续的牌串,其数字之和能被 $M$ 整除。这是一个经典的同余前缀和问题。
- 前缀和:
- 设数组为 $A$,前缀和 $S[i] = A[0] + A[1] + \dots + A[i-1]$。
- 子数组 $A[i \dots j]$ 的和可以表示为 $S[j+1] - S[i]$。
- 整除条件:
- 我们希望找到 $i < j$,使得 $(S[j] - S[i]) % M == 0$。
- 这等价于 $S[j] \equiv S[i] \pmod M$。
- 算法流程:
- 计算前缀和的过程中,时刻对 $M$ 取模。
- 如果在某个位置,当前前缀和模 $M$ 的值之前已经出现过(或者模 $M$ 的值为 0),则说明存在满足条件的子数组。
- 根据鸽巢原理,如果数组长度 $N \ge M$,则必然存在两个前缀和模 $M$ 相同,此时答案一定为 1。
复杂度分析
- 时间复杂度:$O(N)$。只需要遍历一次数组。
- 空间复杂度:$O(M)$ 或 $O(min(N, M))$。用于存储出现过的余数。
浙公网安备 33010602011771号