【Luogu1876】开灯(数论)

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

posted @ 2017-11-07 15:08  小蒟蒻yyb  阅读(383)  评论(0编辑  收藏  举报