题目大意:给 n 盏灯,走 n 趟,第 i 趟只能改变能够整除 i 的灯的状态,问 n 趟后第 n 盏灯是否是亮的。
解题思路:只要考虑第 n 盏灯的改变就行,被改变的次数就是它的因子的个数,因为一开始灯是关闭的,所以一共要改变奇数次才能最终亮起来,即题意为:求一个数的因子是否是奇数个。因子都是成对出现的,既然要奇数个说明有一对因子相等,只算一次,所以化为判断这个数是否是完全平方数。int 太小会 WA。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#include<cmath>
using namespace std;
long long n;
int main() {
while(scanf("%lld", &n) != EOF && n) {
long long t = sqrt(n);
if(t * t == n)
printf("yes\n");
else printf("no\n");
}
return 0;
}