嘉泽 P2120: 【基础】半质数 题解
2024-10-08 21:48:50
简要题意:
求区间内能分解为两个质数乘积的数。
欧拉筛先筛素数。
然后再筛答案。
时间复杂度: \(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\n",i,prime[i]);
if(prime[i]*prime[i]>=N) break;
for(int j=i;j<=cnt;j++) {
// printf("%d %d %d\n",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\n",sum);
return 0;
}
/**************************************************************
Problem: 2120
User: bfw
Language: C++
Result: 正确
Time:42 ms
Memory:31320 kb
****************************************************************/
最新文章
- Java的书写格式,标识符及命名规则,注释
- UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)
- 开发常用之在webstorm中使用cmd
- 带参数的CLR存储过程
- 跟我一起学WCF(3)——利用Web Services开发分布式应用
- 如何把项目托管到GitHub
- 什么是REST架构(转)
- 14.3.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁
- Excel表格导入Mysql数据库,一行存入多条数据的前后台完整实现思路(使用mybatis框架)
- 关于5303狄惟佳同学的myod程序设计的补充实现
- vscode+MinGW+cmake设置轻量ide
- C++反射实现(转)
- 『Re』正则表达式模块_常用方法记录
- Into outfile禁用情况下另类方法拿webshell
- python 约束,异常处理与MD5加密
- jboss eap 6.2 ear包 下使用log4j日志
- @font-face 字体图标的应用
- Angular http跨域
- sqlhelper写调用存储过程方法
- 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明