📜  门| GATE-IT-2004 |第 78 题(1)

📅  最后修改于: 2023-12-03 15:42:19.340000             🧑  作者: Mango

题目介绍:门(GATE-IT-2004) 第 78 题

题目描述

在一个包含 n 个开关的序列中,开始时所有的开关都是关闭的。现在有 m 个人,对于第 i 个人,他从开头开始每隔 a_i 个开关操作一次,将原来关闭的开关变为打开状态,原来打开的开关变为关闭状态。也就是说,如果初始时开关状态为 0 0 0 0 0 0 ,序列为 1 2 3 4 5 6 ,第一个人操作后得到 1 3 5 ,开关状态变为 1 0 1 0 1 0。

求最终开关状态为打开状态的开关编号。

输入格式

第一行输入两个整数,nm

第二行至 m+1 行,每行输入一个整数 a_i,表示第 i 个人的操作间隔。

输出格式

按从小到大输出最终开关状态为打开状态的开关编号。

样例

输入:

6 2
2
3

输出:

2
3
4
解题思路

首先需要记录每个人操作的位置,可以将每个人的操作位置记录到一个列表中。对于序列中每个位置,如果被操作了奇数次,那么最终状态就是打开状态,否则就是关闭状态。

具体实现可以通过模拟。将序列中每个位置的开关状态表示成一个布尔值,使用一个列表来存储每个人的操作位置,根据每个人的操作位置逐个对序列中的数字进行异或操作。最后,遍历所有的开关,找到最终状态为打开状态的开关编号。

代码片段

下面是一个Python3语言实现的程序示例:

n, m = map(int, input().split())
switch = [False] * (n + 1)

for i in range(1, m + 1):
    pos = i
    while pos <= n:
        switch[pos] ^= True
        pos += i

for i in range(1, n + 1):
    if switch[i]:
        print(i)

以上代码通过模拟实现本题的求解,时间复杂度为$O(mn)$,可以通过本题。