开关灯(easy version)题解(讲解):
方法一,数学
开关灯可以转化为求一个数因子的个数,有奇数个因子的数是一个数的平方,最终状态为关。有偶数个因子的数最终状态为开,所以只要求出1~n之间有几个平方数,就可以算出最终状态为开的灯的个数。
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main(){
cin>>n;
ans=n-floor(sqrt(n));
cout<<ans<<endl;
return 0;
}
方法二,模拟
在开关灯的困难版本中会超时。直接模拟开关灯的过程即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,a[N],ans;
int main(){
cin>>n;
memset(a,1,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
a[j]=(a[j]+1)%2;
}
}
for(int i=1;i<=n;i++){
if(a[i]==1)ans++;
}
cout<<ans<<endl;
return 0;
}
开关灯(easy version)题解(代码):
#include<bits/stdc++.h>//方法一,数学
using namespace std;
int n,ans;
int main(){
cin>>n;
ans=n-floor(sqrt(n));
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>//方法二,模拟
using namespace std;
const int N=1010;
int n,a[N],ans;
int main(){
cin>>n;
memset(a,1,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
a[j]=(a[j]+1)%2;
}
}
for(int i=1;i<=n;i++){
if(a[i]==1)ans++;
}
cout<<ans<<endl;
return 0;
}