2 条题解

  • 0
    @ 2024-03-10 12:07:58

    开关灯(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;
    }
    
  • 0
    @ 2024-03-10 11:46:28

    开关灯(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;
    }
    
  • 1

信息

ID
1000
难度
9
分类
(无)
标签
递交数
9
已通过
1
通过率
11%
上传者