zoukankan      html  css  js  c++  java
  • 嘉泽 P2120: 【基础】半质数 题解

    原题链接

    简要题意:

    求区间内能分解为两个质数乘积的数。

    欧拉筛先筛素数。

    然后再筛答案。

    时间复杂度: (O(n)).

    实际得分:(100pts).

    #pragma GCC optimize(2)
    #include<bits/stdc++.h>
    using namespace std;
     
    const int N=5e6+1;
     
    inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
        int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
     
    bool h[N]; int s,e;
    int prime[N],cnt=0;
    bool hal[N];
     
    inline void Euler() {
        h[1]=1;
        for(int i=2;i<N;i++) {
            if(!h[i]) prime[++cnt]=i;
            for(int j=1;j<=cnt && i*prime[j]<N;j++) {
                h[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        } //for(int i=1;i<=cnt;i++) printf("%d ",prime[i]);
        // 欧拉筛
        for(int i=1;i<=cnt;i++) {
    //      printf("%d %d
    ",i,prime[i]);
            if(prime[i]*prime[i]>=N) break;
            for(int j=i;j<=cnt;j++) {
    //          printf("%d %d %d
    ",j,prime[j],prime[i]*prime[j]);
                if(prime[i]*prime[j]>=N) break;
                hal[prime[i]*prime[j]]=1;
            }
        } //筛半质数
    }
     
    int main(){
        Euler(); s=read(),e=read();
        int sum=0; for(int i=s;i<=e;i++) sum+=hal[i];
        printf("%d
    ",sum);
        return 0;
    }
     
    /**************************************************************
        Problem: 2120
        User: bfw
        Language: C++
        Result: 正确
        Time:42 ms
        Memory:31320 kb
    ****************************************************************/
    
  • 相关阅读:
    前后端微服务联调
    Rancher搭建ES容器集群
    Rancher解决磁盘占满异常
    Rancher搭建Redis主从集群
    Rancher搭建NFS持久存储
    Linux普通用户管理
    Rancher部署mysql8
    Delegate背后的秘密
    Java——反射
    redis 操作命令
  • 原文地址:https://www.cnblogs.com/bifanwen/p/12567807.html
Copyright © 2011-2022 走看看