[LeetCode-319]灯泡开关
题目描述
给出n
个灯泡(初始全部熄灭)并且操作n
次, 第i
次把所有是i
的倍数处的灯泡的开关状态取反. 求n
次操作后亮着的灯泡数目.
思路
- 考虑某一个灯泡
i
在n
次操作中被操作的次数, 可以发现该灯泡会被它的所有因子操作. 比如8
会在第1、2、4、8次操作时操作. - 若一个灯泡被操作
k
次, 那么该灯泡一定有k
个不同的因子. 且该灯泡最后的状态唯一取决于k
的奇偶. 即若k
为偶数则灭,k
为奇数则亮. - 问题转化成求$1 - N$中含有奇数个不同因子的数的个数. 考虑到所有因子都是成对出现的, 若数
K
有奇数个不同的因子, 那么某个因子一定出现两次, 该因子一定是$\sqrt K$, 即K
必为完全平方数. - 最后问题转化成求$1 - N$中完全平方数的个数.
Code
1 | using LL = long long; |
复杂度分析
- 时间复杂度$O(\sqrt N)$
- 空间复杂度$O(1)$
欢迎讨论指正