2 条题解

  • 0
    @ 2025-3-29 13:42:38

    本题直接暴力貌似要跑好长时间,可能是我暴力写错了,这道题可以先使用欧拉筛将质数都先筛出来,之后枚举q来二分查找p,那这道题就出来了

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<map>
    #include<cstring>
    #include<array>
    #include<queue>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    using i64=long long;
    //using i128=__int128;
    const i64 INF=1e18;
    const int mod=998244353;
    //const int N=1e9+7;
    const int N=300;
    int primes[N],cnt=0;
    bool vis[N];
    void init(){
        for(int i=2;i<=N;i++){
            if(!vis[i])primes[++cnt]=i;
            for(int j=1;i*primes[j]<=N;j++){
                vis[i*primes[j]]=true;
                if(i%primes[j]==0)break;
            }
        }
    }
    void solve(){
        init();
        i64 ans=0;
        int k=20250309;
        for(int i=1;i<=cnt;i++){
            i64 q=primes[i];
            i64 q_sub=q*q*q;
            //找到符合题意p的最大值
            i64 max_p=k/q_sub;
            max_p=min(max_p,q-1);
            if(max_p<2)continue;
            //进行二分查找
            int pos=upper_bound(primes+1,primes+1+cnt,max_p)-primes;
            ans+=distance(primes+1,primes+pos);
        }
        cout<<ans<<'\n';
    }
    int main(){
        int _=1;
        //cin>>_;
        while(_--)solve();
        return 0;
    }
    

    信息

    ID
    301
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    131
    已通过
    41
    上传者