1 条题解
-
0
#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
- 上传者