初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则打开,如果打开则关闭)。第 i 轮,你每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
示例:
输入: 3 输出: 1 解释: 状态off表示灯泡关闭,on表示开启。 初始时, 灯泡状态 [off, off, off]. 第一轮后, 灯泡状态 [on, on, on]. 第二轮后, 灯泡状态 [on, off, on]. 第三轮后, 灯泡状态 [on, off, off]. 你应该返回 1,因为只有一个灯泡还亮着。
首先模拟法,一个01数组来进行间隔开关,最后对数组求和。
时间复杂度O(n^2)果然超时了。。。
我就知道没那么容易。
考虑n个1的数组进行0,1转换,全部设为1已经是第一轮迭代了,我们相当于从第二轮迭代开始。
因为每个元素只有两个值。所以当这个元素经历偶数次变换就还是1,经历奇数次变换就是0。
说实话,我想到这但依然没有得到正确答案,我参考了别人的答案后豁然开朗。
基于奇数偶数次变换这个想法,我们考虑1~n这些灯泡怎么样可以被变换:
对于第二轮变换开始直到第n轮变换的第i次变换,如果这个i是标号的因子,那么一定会变。
所以等价于:“数字k(第k个灯泡)有多少个从2~k的因子”。
比如:8在i=2,4,8时经历了变换,所以n=8时最后8号灯泡是灭了的(可以拿纸笔试试)。
我们考察任意一个n,比如100。
100的因子有(大于等于2 的):2,4,5,10,20,25,50,100。
也就是说它经历8次变换,是1,实际上我们可以因数分为几组,因为2,50一组,4,25一组,5,20一组,剩下的100要和10一组了。
我们发现规律:如果平方根也在因子中,那么会有偶数次变换,否则因子n只能单独一组,这是因为对于一个数字来说,如果没有平方根当因子,那么算上因子1,总是成对出现的,平方根因子因为其特殊性,将因子个数变成不成对的。
所以,结论:最终变换得到1的灯泡是平方数编号的。
等价于求:1-n里平方数的个数
等价于:int(sqrt(n))
代码太简单了就不贴了。