P1876 开灯

题目背景

该题的题目是不是感到很眼熟呢?

事实上,如果你懂的方法,该题的代码简直不能再短。

但是如果你不懂得呢?那。。。(自己去想)

题目描述

首先所有的灯都是关的(注意是关!),编号为 11 的人走过来,把是 11 的倍数的灯全部打开,编号为 22 的人把是 22 的倍数的灯全部关上,编号为 33 的人又把是 33 的倍数的灯开的关上,关的开起来……直到第 NN 个人为止。

给定 NN,求 NN 轮之后,还有哪几盏是开着的。

输入格式

一个数 NN,表示灯的个数和操作的轮数。

输出格式

若干数,表示开着的电灯编号。

输入输出样例

输入 #1复制

5

输出 #1复制

1 4

说明/提示

【数据范围】

对于 100 \%100% 的数据,1 \le N \le 2^{40}1≤N≤240。

【其他说明】

数学题!

枚举小于n的完全平方数输出

下证明为什么是完全平方数:

首先,你要知道,对于每一个数n,除非它是完全平方数,否则它一定有偶数个因子。

因为如果i是n的因子,那么n/i也一定是n的因子。例如当n=20时,i=4是20的因子,那么n/i=5也是20的因子

这样,n的因子都是成对出现的,所以n有偶数个因子

但是,有一种特殊情况,即n/i=i。例如4/2=2。由于i和n/i是同一个数,算因子只能是一个,这时n的因子就是奇数个

把n/i=i变形,得n=i*i,即n是完全平方数,所以只有完全平方数有奇数个因子

对于本题,由于灯只有两种状态(开或关,可类比于奇数和偶数),而初始状态是关的

而每个灯泡如果能被人的编号整除,状态就会变化。

把整个过程看成一个整体,也就是只有这一盏灯的因数的编号的人,才会按开关

由于灯的开关按偶数次状态不变,还是关(起始是关),所以,灯的开关只有按奇数次,才会开。

发现问题和上述提到的只有完全平方数有奇数个因子的问题是一样的

也就是如果灯的编号是完全平方数,那么它会被按奇数次,最后就是开着的

输入n轮,所以只需求出<=n的完全平方数就行了。

#include<iostream>//并不用cmath
using namespace std;
int main(){
    long long n;cin>>n;
    for(int i=1;i*i<=n;i++)//i是中间数,我不用sqrt是为了少写个文件头
    cout<<i*i<<" ";//输出的全是完全平方数
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值