1 条题解

  • 0
    @ 2026-1-28 14:31:14
    #include<bits/stdc++.h>
    using namespace std;
    // [1] arr:存储筛选出的所有质数;f:筛法标记数组,true表示当前数为质数
    long long arr[5000010];
    bool f[5000010];
    
    int main(){
        long long s,e; // [2] s:统计区间的起始值,e:统计区间的结束值
        cin>>s>>e; // [3] 读取输入的区间范围
        long long x=0,sum=0; // [4] x:质数数组的存储下标;sum:符合条件的半质数数量
        memset(f,true,sizeof(f)); // [5] 初始化筛法数组,默认所有数为质数
    
        // [6] 线性筛(欧拉筛):生成小于等于e的所有质数,保证每个合数仅被最小质因子筛一次
        for(int i=2;i<=e;i++){
            if(f[i]) arr[x++]=i; // 若当前数是质数,存入质数数组arr
            // 用当前数与已存质数的乘积筛去合数
            for(int j=0;j<x&& arr[j]*i<=e;j++){
                f[arr[j]*i]=false; // 标记该乘积为非质数
                if(i%arr[j]==0) break; // 若i是当前质数的倍数,停止当前循环(避免重复筛除)
            }
        }
    
        // [7] 统计区间[s,e]内的半质数数量(半质数=两个质数的乘积,包括相同质数相乘)
        for(int i=0;i<x;i++){
            // j从i开始,避免重复统计(如2*3和3*2视为同一个半质数)
            for(int j=i;arr[i]*arr[j]<=e;j++){
                // 若乘积在区间[s,e]内,计数加1
                if(arr[i]*arr[j]<=e && arr[i]*arr[j]>=s) sum++;
            }
        }
    
        cout<<sum; // [8] 输出区间内的半质数数量
        return 0;
    }
    
    • 1

    信息

    ID
    1231
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者