319. 灯泡开关(高频题)

本文探讨了灯泡开关谜题的解决方案。初始时所有灯泡关闭,通过n轮开关操作,每次操作按规律切换灯泡状态。最终,文章提供了一个简洁的方法来计算n轮后亮着的灯泡数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

初始时有 n 个灯泡处于关闭状态。

对某个灯泡切换开关意味着:如果灯泡状态为关闭,那该灯泡就会被开启;而灯泡状态为开启,那该灯泡就会被关闭。

第 1 轮,每个灯泡切换一次开关。即,打开所有的灯泡。

第 2 轮,每两个灯泡切换一次开关。 即,每两个灯泡关闭一个。

第 3 轮,每三个灯泡切换一次开关。

第 i 轮,每 i 个灯泡切换一次开关。 而第 n 轮,你只切换最后一个灯泡的开关。

找出 n 轮后有多少个亮着的灯泡。
在这里插入图片描述

提示:

  • 0 <= n <= 109

2. 解题思路

题目简化:
n 个灯泡,从 1 到 n,最开始全部是关着的。
然后你会进行 n 轮操作:

  • 第 1 轮:你把所有灯泡的开关拨一次(全开)。
  • 第 2 轮:你拨动所有编号是 2 的倍数的灯泡(2、4、6…)。
  • 第 3 轮:你拨动所有编号是 3 的倍数的灯泡(3、6、9…)。
  • 第 n 轮:你拨动所有编号是 n 的倍数的灯泡。

最后问你:有多少个灯泡是亮着的?

一个灯泡最终会亮着的前提是它被拨动了奇数次。
因为:

  • 关 → 开(第1次拨动)
  • 开 → 关(第2次拨动)
  • 如果总共拨动奇数次,它就开着
  • 偶数次,它就关着

那接下来是不是求一个灯泡被拨动多少次?
以第 k 个灯泡为例:

  • 它会在 所有能整除 k 的轮数中被拨动一次
  • 换句话说,它会被拨动的次数 = k 的因数个数。

🔍 举个例子:
灯泡 6:

  • 因数有:1, 2, 3, 6(共 4 个)→ 被拨动 4 次 → 最终关闭。

灯泡 9:

  • 因数有:1, 3, 9(共 3 个)→ 被拨动 3 次 → 最终打开。

所以:

  • 一般因数成对出现:如 12 的因数有 (1,12), (2,6), (3,4) → 一共 6 个
  • 但如果是完全平方数,比如 9:因数是 (1,9), (3,3) → 因数 3 重复了一次,所以总数是奇数

✅ 所以,最终亮着的灯泡的个数 = 小于等于 n 的平方数的个数

[!example]
n = 10 时,小于等于 10 的平方数是:

  • 1² = 1
  • 2² = 4
  • 3² = 9

3. 代码

class Solution {
    public int bulbSwitch(int n) {
        return (int) Math.sqrt(n);
    }
}
### 关于CTFShow Web 319的解思路 目前针对CTFShow平台上具体编号为Web 319目,尚未有直接提及该目的公开详细解析。然而,基于已有的参考资料和其他类似型的特点,可以推测此可能涉及常见的Web安全漏洞或技术点。 #### 可能的技术方向分析 根据以往的经验和类似的Web挑战[^1],CTFShow平台上的Web类目通常围绕以下几个方面展开: 1. **SQL注入** 如果目涉及到数据库操作,可能存在未正确过滤用户输入的情况,从而引发SQL注入攻击的可能性。可以通过构造特定的payload来测试是否存在此类漏洞[^4]。 2. **文件上传与解析漏洞** 若目允许文件上传功能,则需注意服务器端对于文件类型验证不足或者存在MIME类型绕过等问。尝试利用常见图片马(如PHP代码嵌入到图像文件中)等方式突破限制[^2]。 3. **JWT篡改** 对于涉及JSON Web Token (JWT) 的场景下,可能会考察选手对签名算法的理解程度以及如何通过修改token字段实现权限提升等目标[^3]。 4. **整数溢出/强制转型** 类似`intval()`函数处理不当所造成的安全隐患也可能成为考点之一。当程序逻辑依赖数值比较却忽略了潜在的数据类型转换风险时,就容易造成预期之外的行为发生。 由于缺乏关于Web 319的具体描述信息,在实际解答过程中还需要结合目给出的实际环境进一步探索并调整策略。 以下是基于上述假设编写的一个简单Python脚本用于辅助检测某些类型的漏洞: ```python import requests url = 'http://example.com/vulnerable_endpoint' # 替换为目标URL headers = {'Content-Type': 'application/x-www-form-urlencoded'} data = { 'param': "' OR '1'='1", # 测试SQL注入的基本Payload } response = requests.post(url, headers=headers, data=data) if "error" not in response.text.lower(): print("[+] Potential SQL Injection Vulnerability Found!") else: print("[-] No obvious vulnerabilities detected.") ``` 请注意以上仅为示范用途,请勿非法入侵任何网站! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值