小b有n个关闭的灯泡,编号为1…n。
小b会进行n轮操作,第i轮她会将编号为i的倍数的灯泡的开关状态取反,即开变成关,关变成开。
求n轮操作后,有多少灯泡是亮着的。
收起
输入
输入一个数字表示灯泡数n,其中1<n≤10000000
输出
输出一个数字表示最终亮着的灯泡数
输入样例
3
输出样例
1
思路:求亮着的灯泡数是在求1~n中每个数因子的个数,打表后会发现当i为奇数或sqrt(i)不是整数时,它的因子个数为偶数,而sqrt(i)为整数时因子个数为奇数,分析题意会发现当i的因子个数为偶数时,最准的状态为灭,而因子个数为奇数最准状态为亮,综合以上分析可得结论:求亮着的灯泡树是在求1 ~n中可开开方数的数量(sqrt(n))。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
cout << int(sqrt(n)) << endl;
getchar();
getchar();
}
打表分析
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10000000;
int init[maxn];
int main()
{
memset(init, 0, sizeof(init));
int n;
cin >> n;
int count = n;
for(int i=1;i<=sqrt(n);i++)
for (int j = i; j*i <= n; j++)
{
if (i == j) init[i*j] += 1;
else init[i*j] += 2;
}
for (int i = 2; i <= n; i++)
{
if (init[i] % 2==0)
{
count--;
}
}
cout << count << endl;
getchar();
getchar();
}