PC/UVa 题号: 110701/10110 Light,More Light

本文探讨了一个有趣的问题:在经过特定次数的操作后,一系列初始关闭的灯泡中最后一个灯泡的状态。通过对操作规律的分析,发现只有当灯泡编号为完全平方数时,其最终状态才会开启。

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

     题意大概:走廊里有n个灯泡,一个人就来回走n次,(来回指的是一来一回算一次)当走第i次的时候他只能按动能被i整除的灯泡按钮,但是回来的时候不按开关,求最后一个灯泡是开着的还是关着的

  一开始读题的时候很纠结”来回“俩字,很郁闷!(一开始题中没说灯的状态是开着的还是关着的,但是本着节约的原则,我觉得是关着的,事实证明是关着的,嘿嘿)

   分析: 当走第i次的时候他只能按动能被i整除的灯泡按钮,也就是说每次第n个灯泡被改动的次数是1~n 中能整除n 的数的个数,如果是偶数个就是关着的,如果是奇数个就是开着的,但是注意本题的数据范围是2^32-1 太大了,如果用for循环必然超时

   举个例子

n :      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18……

d(n):  1 2 2 3 2 4 2 4 3  4   2   6    2    4   4   5    2   6……

d(n) 为对应数的因式的个数,可以发现 当n为某一个数的平方的时候 d(n)为奇数,其他的则是偶数个,对应上面这道题,当n为某一个 数的平方的时候最后一个灯被改动奇数次,也就是说它是亮着的,其他的则是暗着的

代码:

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
 unsigned n;
 while(cin>>n)
 {
  if(n==0) break;
  unsigned t;
  double m=sqrt((double)n);
  t=(int)m;
  if(m==t)
  cout<<"yes"<<endl;
  else cout<<"no"<<endl;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值