题目大意:有一串灯,有打开和关闭两种状态,开始状态为关闭,一个人第i次走过这些灯,只有这些灯编号能整除i的灯的状态可以被改变(走一次代表一个来回,回来的途中不改变灯的状态)
思路分析:给出n(第i趟),也就是求n的因子数,当n的因子数为奇数时灯的状态是被打开的,否则因子数为偶数,一次关,一次开,状态不改变。
正常求出n的因子数在判断因子数的奇偶性,会超时,有一种很简单的算法,就是只有平方数的因数是奇数,直接判断这个数是不是平方数就好。
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
long long n;
while(scanf("%lld",&n)==1){
if(n==0)
break;
long long a=(long long)sqrt(n+0.5);
if(a*a==n)
printf("yes\n");
else printf("no\n");
}
return 0;
}