洛谷.P1876 开灯(完全平方数)

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

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

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

题目描述
首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来……直到第N个人为止。

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

输入格式
一个数N,表示灯的个数和操作的轮数

输出格式
若干数,表示开着的电灯编号

说明/提示
1<=N<=2^40
数学题!
原题链接:link.

emmm,怎么说呢,这道题还真没毛病,dalao都说用小学奥数就能解出来,然鹅,我不会,我便利了—说多了都是泪

首先,先来了解一个知识点:
对于每一个数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的完全平方数就行了。

/*
看了其他题解,很多人已经知道是判断是否为完全平方数。 但可能还有人不懂为什么要求完全平方数,可看看我的思路
首先要知道,当一个数因数的个数为奇数时,灯是亮的
一个非完全平方数,因数肯定为偶数 例:8:(1,2,4,8)
一个完全平方数,因数肯定为奇数 例:9:(1,3,9)
其实简单来说非完全平方数的每一个因数都可以跟一个不等自己的数相乘得到这个非完全平方数(18,24);所以因数一定是偶数
完全平方数其中一个因数乘自己可得到这个完全平方数(19,33);所以因数一定是奇数;
*/

#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、付费专栏及课程。

余额充值