酷代码 AI
菜单

有n个灯( 1 ≤ 𝑛 ≤ 10 9 ),编号为1,2,……n,同时有n个人,依次对灯进行操作。 开始时,所有灯是关闭状态。 第1人操作:将所有灯打开 第2人操作:将2及2的倍数的灯,状态取反,即开状态变为关状态,其状态变为开状态。 第3人操作:将3及3倍数的灯状态取反。 …… 第i人操作:将i及i的倍数的灯状态取反(1≤i≤n),当所有操作完成之后,计算出所有开状态灯的编号之和。 例如:n=6, 0—关状态,1—开状态 开始 0 0 0 0 0 0 第1人操作之后:变成 1 1 1 1 1 1 第2人操作之后:变成 1 0 1 0 1 0 第3人操作之后:变成 1 0 0 0 1 1 第4人操作之后:变成 1 0 0 1 1 1 第5人操作之后:变成 1 0 0 1 0 1 第6人操作之后:变成 1 0 0 1 0 0 所有开状态灯编号之和为 1+4=5 输入 一个整数 𝑛 输出 一个整数,即操作后所有开状态的灯编号之和。 样例输入 复制 6 样例输出 复制 5 来源/分类 数论 筛法

这个问题是经典的“开关灯”问题。每个灯作的次数等于其编号的因数个数。 灯最终状态由操作次数的奇偶性决定:奇数次操作灯亮,偶数次操作灯灭。 一个数有奇数个因数当且仅当它是完全平方数。 亮灯的编号就是所有不超过 n 的完全平方数。 它们的和就是: \[ \sum_{k=1}^{\lfloor \sqrt{n} \rfloor} k^2 \] 代码实现: ```python n = int(input()) k = int(n 0.5) ans = sum(i * i for i in range(1, k + 1)) print(ans) ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 当 n 很大时(最大 1e9),直接遍历 1 到 n 会超时,必须用数学方法。 2. 计算平方根取整时,注意浮点数精度问题,可以用 int(n 0.5) 或 math.isqrt(n)(Python 3.8+)。 3. 求和时使用公式或循环,注意数据范围,Python 整数不会溢出,但其他语言可能需要使用 long long 类型。 [2026-01-18 12:41:43 | AI写代码神器 | 271点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多