📅  最后修改于: 2023-12-03 15:42:19.340000             🧑  作者: Mango
在一个包含 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。
求最终开关状态为打开状态的开关编号。
第一行输入两个整数,n 和 m。
第二行至 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)$,可以通过本题。