参看资料:
https://blog.csdn.net/sodacoco/article/details/89291759
题目:
小b有n个关闭的灯泡,编号为1...n。
小b会进行n轮操作,第i轮她会将编号为i的倍数的灯泡的开关状态取反,即开变成关,关变成开。
求n轮操作后,有多少灯泡是亮着的。
输入
输入一个数字表示灯泡数n,其中1<n≤10000000输出
输出一个数字表示最终亮着的灯泡数输入样例
3输出样例
1
题目大意:
给定n个灯泡,初始状态为 关 ,进行n次操作,第 i 次操作的内容是将 i 的倍数的开关按一下,求最终开着的灯的数目。
解题思路:
求因子数目,根据因子数目奇偶性判断最后灯的状态。
。。这年头简单题都这么有个性吗。。直接求因子数目会TLE,改成线性筛法的因子打表可以A。
实现代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=10000002;
int y[maxn];
void init(int n)
{
for(int i = 1; i * i <= n; i++)
{
for(int j = i; i * j <= n; j++)
{
y[i * j] += 2;
if(i == j)y[i * j]--;
}
}
}
int main(){
int n,ans=0;
scanf("%d",&n);
init(n);
for(int i=1;i<=n;i++){
//cout<<"y("<<i<<")="<<y[i]<<endl;
if(y[i]%2==1)
ans++;
}
printf("%d\n",ans);
return 0;
}