华为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$ 整除。这是一个经典的同余前缀和问题。

  1. 前缀和
    • 设数组为 $A$,前缀和 $S[i] = A[0] + A[1] + \dots + A[i-1]$。
    • 子数组 $A[i \dots j]$ 的和可以表示为 $S[j+1] - S[i]$。
  2. 整除条件
    • 我们希望找到 $i < j$,使得 $(S[j] - S[i]) % M == 0$。
    • 这等价于 $S[j] \equiv S[i] \pmod M$。
  3. 算法流程
    • 计算前缀和的过程中,时刻对 $M$ 取模。
    • 如果在某个位置,当前前缀和模 $M$ 的值之前已经出现过(或者模 $M$ 的值为 0),则说明存在满足条件的子数组。
    • 根据鸽巢原理,如果数组长度 $N \ge M$,则必然存在两个前缀和模 $M$ 相同,此时答案一定为 1。

复杂度分析

  • 时间复杂度:$O(N)$。只需要遍历一次数组。
  • 空间复杂度:$O(M)$ 或 $O(min(N, M))$。用于存储出现过的余数。
posted @ 2026-03-08 23:13  华为od算法大师  阅读(3)  评论(0)    收藏  举报