【Luogu1876】开灯(数论)
题面
题目描述
首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来……直到第N个人为止。
给定N,求N轮之后,还有哪几盏是开着的。
输入输出格式
输入格式:
一个数N,表示灯的个数和操作的轮数
输出格式:
若干数,表示开着的电灯编号
说明
1<=N<=2^40
题解
凭什么这道题目是入门难度!!!!
就因为代码简单????
想一想,一开始所有的灯都是关着的,
如果被操控若干次后,灯开着
则意味着灯被操控了奇数次
而一个灯被操控的次数是他的约数的个数
一个数(n=p_1^{a_1}*p_2^{a_2}...p_k^{a_k})
的约数个数是((a_1+1)(a_2+1)...(a_k+1))
而且这个数是奇数
意味这所有的(a_i)都是偶数
也就是说,(n=m^2)
其中(m=p_1^{a_1/2}*p_2^{a_2/2}...p_k^{a_k/2})
所以,所有的最终的满足条件的(n)都是完全平方数
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
long long n;
int main()
{
cin>>n;
for(int i=1;i<=sqrt(n);++i)
printf("%lld ",1ll*i*i);
puts("");
return 0;
}