题意大概:走廊里有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;
}