首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来……直到第N个人为止。
给定N,求N轮之后,还有哪几盏是开着的。
一道像我一样辣鸡的辣鸡题,所以说我被同水平的辣鸡题卡思路了(想到了筛法,然后思路就RE了)。
显然能对于每一盏灯,只有它的编号的因子的人会对它进行操作,并且如果操作是偶数次,就会灭,否则就会亮。
然后我们来考虑什么时候一个数的因子有奇数个。
对于一个数,进行因数分解(注意不是质因数),比如说6,一个因子是3,另一个因子就是6/3=2,所以说因子是成对的,那什么时候才会有奇数个因子呢?
当n/m=m时,有一对因子重合了,变成了一个,然后就VERY GOOD 了,很明显,完全平方数有奇数个因子。
然后就OK了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#define ll long long
using namespace std;
ll n;
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
if(i*i>n)break;
else printf("%lld ",i*i);
}
return 0;
}