【Luogu1876】开灯(数论)

时间:2022-06-09 14:53:44

【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;
}