51nod 2489 小b和灯泡
题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=2489
一、题目描述
小b有n个关闭的灯泡,编号为1...n。
小b会进行n轮操作,第i轮她会将编号为i的倍数的灯泡的开关状态取反,即开变成关,关变成开。
求n轮操作后,有多少灯泡是亮着的。
输入:
输入一个数字表示灯泡数n,其中1<n≤10000000
输出:
输出一个数字表示最终亮着的灯泡数
样例输入:
3
样例输出:
1
二、思路描述
用暴力的方法肯定会超时的,所以肯定不可以
对于第1个灯泡,第1次操作会反转开关。最终状态是开
对于第2个灯泡,第1、2次操作会反转开关。最终状态是关
对于第3个灯泡,第1、3次操作会反转开关。最终状态是关
对于第4个灯泡,第1、2、4次操作会反转开关。最终状态是开
对于第i个灯泡,第i的因子次操作都会使开关反转。
所以因子个数为偶数的最终状态是关,因子个数为奇数的最终状态是开。只有完全平方数的因子数是奇数。
因为如果A是C的因数,则C/A也是C的因数。因此因数总是成对出现的,只有当C/A=A时,C的因数个数才可能是奇数。
所以只需要统计出1-n中有多少个完全平方数即可。
三、代码
#include<cstdio> #include<iostream> using namespace std; int main(){ int n, ans=0; cin >> n; for(int i = 1;i*i <= n;i++){ ans++; } cout << ans << endl; return 0; }