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

 

原文地址:https://www.cnblogs.com/elisa02/p/12813085.html