leetcode 319 N个人开关N盏灯

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

示例:

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

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

转自https://blog.csdn.net/vhghhd/article/details/80904662

解题:

1.  第M(M<N)个人的操作只能影响到后面M到N盏灯,无法影响到前M-1盏灯,所以第M个人操作后,这个状态下灯的亮灭个数F(M)=F(M-1)+0/1(当第M盏灯操作了偶数次时,加0;当第M盏灯操作了奇数次时,加1)

2. 第M盏灯操作了多少次,等价于M这个数有多少个因数,所以F(M)=F(M-1)+0/1(M的因子个数为偶数,加0;M的因子个数为奇数,加1)

3. 一个数要么是素数,因子个数为2(1和它自身),要么是合数,因子个数为奇数(只含有1个质因子,即为平方数时)或偶数(假设其有n个质因子,则其因数的总个数为C0n+C1n+....CNn,化简后为若n为偶数,2x(C0n+C1n+...+C((n-1)/2))+C(n/2)n),偶数+偶数=偶数;若n为奇数2x(C0n+C1n+...+C((n-1)/2)),2x任意数=偶数 )

4. 所以,只有这个数为平方数时,其因子的个数才为奇数

5. 所以,F(M)=F(M-1)+0/1(当M为非平方数时,加0;当M为平方数时,加1)

6. 所以,此问题最终公式为:对N开根号,将其整数部分提取出来即为答案

7. 编程实现:result = (int)(sqrt(N));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值