1364: 开灯与关灯
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版]
题目描述
有一个叫做Mabu的人在大学的走廊里面反复开灯和关灯。每个灯泡都有各自的开关,如果灯是关着的,那么按开关后就会开灯,再按一次则会将其关上。最初的时候所有灯都是关上的。
Mabu做了一件很奇特的事情:如果走廊里有n个灯泡,他就在走廊里来回走n次。在他走第i次的时候,只按动可以被i整除的位置(位置编号1到n)上的开关。在他走到走廊尽头,然后走回初始位置时,不会按动任何开关。你的任务是确定最后一个灯泡的最终状态。它是开着的,还是关着的?
输入
输入每一行将给出一个走廊里的电灯总数n(n<=2^32-1)。n=0表示输入结束,你的程序不应处理这一行。
输出
如果灯炮开着,输出“yes”;如果是关着,输出“no”。每个数据在单独的一行输出。
样例输入
3
6241
8191
0
简单题:
1.直接统计n的因子个数。
2.想深入点,根据数学特性,因为只要知道n因子个数的奇偶性 也可以不统计。
n = x^2一定是奇数个因子~
ac_code:
直接统计:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL n;
while(cin>>n)
{
if(n==0) break;
LL res = 0;
for(LL i = 1; i*i <= n; i++)
{
if(n % i == 0)
{
res++;
LL x = n / i;
LL y = n / x;
if(x != y) res++;
}
}
if(res & 1) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
想深入点,可以节省代码量,看起来更巧妙!!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int x = sqrt(n);
if(x * x == n) puts("yes");
else puts("no");
}
return 0;
}