我们可以使用一个长度为 NN 的布尔数组来表示每盏灯的状态,初始时全部为开启状态。

然后,我们按照题目描述的规则,依次进行 NN 次操作。对于每个操作,我们需要遍历灯的编号,找到当前操作人的倍数,然后将对应位置的灯状态取反。

最后,我们遍历布尔数组,找到关闭状态的灯的编号,输出即可。

以下是实现这个算法的示例代码:

N = int(input())
lights = [True] * N

for i in range(2, N+1):
    for j in range(i, N+1, i):
        lights[j-1] = not lights[j-1]

result = [str(i+1) for i, light in enumerate(lights) if not light]
print(' '.join(result))

时间复杂度分析: 对于每个操作,我们需要遍历灯的编号,找到当前操作人的倍数,并将对应位置的灯状态取反。这一操作的时间复杂度为 O(N)。一共进行 NN 次操作,所以总的时间复杂度为 O(N^2)。

假设有 NN 盏灯NN 为不大于 50005000 的正整数从 11 到 NN 按顺序依次编号初始时全部处于开启状态;第一个人11 号将灯全部关闭第二个人22 号将编号为 22 的倍数的灯打开第三个人33 号将编号为 33 的倍数的灯做相反处理即将打开的灯关闭将关闭的灯打开。依照编号递增顺序以后的人都和 33 号一样将凡是自己编号倍数的灯做相反处理。问当第 NN 个人操作完之后有哪些灯是关闭着的?

原文地址: https://www.cveoy.top/t/topic/iEuG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录