题解 007 题目 AT_abc383_d

· · 题解

说在前面

这是我赛时的做法,并不是很优秀,时间复杂度似乎是错的,但是可以通过,因此分享出来,欢迎大家指正。

题目分析

通过代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool ip[4000005];
int n,ans;
bool check1(int x){
    if (!ip[x]) return 0;
    // 如果 x 是质数可以直接跳过,x 肯定不会超过 2e6,可以直接判断。
    for (int i=2;i*i<x;i++){
        if (x%i!=0) continue;
        if ((!ip[i])&&(!ip[x/i])) return 1;
        else return 0; // 直接返回 0 可以缩短运行时间。
    }
    return 0;
}
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    ip[1]=1;
    for (int i=2;i<=2000;i++){
        if (ip[i]==0){
            for (int j=i*2;j<=4000000;j+=i){
                ip[j]=1;
            }
        }
    } // 埃氏筛。
    for (int i=2;i*i<=n;i++){
        if (check1(i)) ans++;
    } // 情况 1。
    for (int i=2;i*i*i*i*i*i*i*i<=n;i++){
        if (!ip[i]) ans++;
    } // 情况 2。
    cout<<ans;
    return 0;
}