login
欢迎访问QkqBeer博客园!

数学题(leetcode 319 python)

题目

初始时有 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i轮,每 个灯泡切换一次开关。 对于第 轮,你只切换最后一个灯泡的开关。 找出 轮后有多少个亮着的灯泡。

示例:

输入: 3
输出: 1 
解释: 
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 

你应该返回 1,因为只有一个灯泡还亮着。

思路

注意到,对第K个灯泡(K从0到n-1),在第i轮,当且仅当(K + 1) % i = 0时,灯泡的状态会翻转。
在第一轮,所有灯泡都被点亮。灯泡K在n轮后依然是点亮的,则灯泡K在2到n轮间被翻转了偶数次。
等价于,在[2, n]中有偶数个轮次满足(K + 1) % i = 0。
等价于,K + 1在[2, n]间有偶数个因子。
等价于,K + 1在[2, K]间有奇数个因子。(K+1本身已被除去)
现在注意到,如果(K + 1) / j = i是整数,则i, j都是K + 1的因子,因子数量应该是偶数个。但K + 1有奇数个因子,那么就存在一个数i, (K + 1) / j = i, 并且i = j。换句话说,K+1自身就是一个完全平方数。

结论:亮灯数等于[1, n]内的完全平方数个数,即:⌊n⌋

代码
class Solution(object):
    def bulbSwitch(self, n):
        """
        :type n: int
        :rtype: int
        """
        return int(n ** 0.5)

  

 
posted @ 2019-01-07 16:24  BeerQkq  阅读(272)  评论(0编辑  收藏  举报