【noi 2.7_413】Calling Extraterrestrial Intelligence Again(算法效率--线性筛素数+二分+测时)
题意:给3个数M,A,B,求两个质数P,Q。使其满足P*Q<=M且A/B<=P/Q<=1,并使P*Q最大。输入若干行以0,0,0结尾。
解法:先线性筛出素数表,再枚举出P,二分出对应的最大的Q,得出最佳答案。
注意——1.第二个的代码是标准的欧拉筛,可求每个数的最小质因数; 2. 像第一个代码二分时通过位运算,使pri[]的下标尽量大来实现,比一般的二分快了很多很多!!一个6ms,一个502ms。具体请见代码。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6 #define M 100010
7 #define D 1010
8
9 bool np[M/10];
10 int pri[M/20];
11 int cnt;
12
13 int mmin(int x,int y) {return x<y?x:y;}
14 void init_pri()
15 {
16 cnt=0;
17 memset(np,false,sizeof(np));
18 for (int i=2;i<=M/10;i++)
19 {
20 if (!np[i]) pri[++cnt]=i;
21 for (int j=1;j<=cnt&&i*pri[j]<=M/10;j++)
22 {
23 np[i*pri[j]]=true;
24 if (i%pri[j]==0) break;//不能调到前一句前
25 }
26 }
27 /*2
28 cnt=0;
29 memset(np,false,sizeof(np));
30 for (int i=2;i<=M/10;i++)
31 {
32 if (np[i]) continue;
33 pri[++cnt]=i;
34 for (int j=2;i*j<=M/10;j++)
35 np[i*j]=true;
36 }
37 */
38 }
39 int main()
40 {
41 init_pri();
42 while (1)
43 {
44 int m,x,y;
45 scanf("%d%d%d",&m,&x,&y);
46 if (m+x+y==0) break;
47 int pp,qq; pp=qq=0;
48 for (int i=1;i<=cnt;i++)
49 {
50 int p=pri[i],lim=mmin(y*p/x,m/p);
51 int tmp=i;
52 for (int j=12;j>=0;j--)
53 if (tmp+(1<<j)<=cnt && pri[tmp+(1<<j)]<=lim) tmp+=(1<<j);
54 if (tmp==i && p*pri[tmp]>m) break;//上面的位调整没有一次成功,这时可能就单乘也是不合法的
55 int q=pri[tmp];
56 if (p*q>pp*qq) pp=p,qq=q;
57 }
58 printf("%d %d\n",pp,qq);
59 }
60 return 0;
61 }
62 快
Code1 快
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6 #define M 100000
7 #define N 1000
8 typedef long long LL;
9
10 int pr=0;
11 LL mn_prim[M+10],prim[M+10];
12
13 void get_prime()
14 {
15 memset(mn_prim,0,sizeof(mn_prim));//最小质因子
16 for (LL i=2;i<=M;i++)
17 {
18 if (!mn_prim[i]) prim[++pr]=i;
19 for (int j=1;j<=pr;j++)
20 {
21 if (prim[j]*i>M) break;
22 mn_prim[prim[j]*i]=prim[j];
23 if (i%prim[j]==0) break;//
24 }
25 }
26 }
27 int main()
28 {
29 LL m,a,b;
30 get_prime();
31 while (1)
32 {
33 scanf("%lld%lld%lld",&m,&a,&b);
34 if (!m&&!a&&!b) break;
35 LL tp=0,tq=0;
36 for (int i=1;i<=pr;i++)
37 {
38 LL p,qq=0;
39 p=prim[i];
40 int l=i,r=pr;
41 while (l<=r)
42 {
43 int mid=(l+r)>>1;
44 LL q=prim[mid];
45 if (p*q>m || a*q>b*p) r=mid-1;//相乘会超出int范围
46 else qq=q,l=mid+1;
47 }
48 if (p*qq>tp*tq) tp=p,tq=qq;
49 }
50 printf("%lld %lld\n",tp,tq);
51 }
52 return 0;
53 }
Code2 慢
而关于线性筛素数,我有2种方法。第一种是每得到一个素数,就让它乘1、2、3...,得到的数标记为不是素数;第二种是最常见的,也是比较快的,每个数都与已得到的素数相乘,得到的数也标记为不是素数,但要小心:当这个数是当前枚举的素数的倍数时,就要跳出循环了。而语句的顺序在理论上为什么在后面,我就不清楚了...O.O
【noi 2.7_413】Calling Extraterrestrial Intelligence Again(算法效率--线性筛素数+二分+测时)的更多相关文章
- poj 1411 Calling Extraterrestrial Intelligence Again(超时)
Calling Extraterrestrial Intelligence Again Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- hdu 1239 Calling Extraterrestrial Intelligence Again (暴力枚举)
Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- HDUOJ-----(1329)Calling Extraterrestrial Intelligence Again
Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 【HDOJ】1239 Calling Extraterrestrial Intelligence Again
这题wa了很多词,题目本身很简单,把a/b搞反了,半天才检查出来. #include <stdio.h> #include <string.h> #include <ma ...
- poj 1411 Calling Extraterrestrial Intelligence Again
题意:给你数m,a,b,假设有数p,q,满足p*q<=m同时a/b<=p/q<=1,求当p*q最大的p和q的值 方法:暴力枚举 -_-|| and 优化范围 我们可以注意到在某一个m ...
- Calling Extraterrestrial Intelligence Again POJ 1411
题目链接:http://poj.org/problem?id=1411 题目大意:找两个素数p,q满足a/b<=p/q<=1 且p*q<=m,求p*q最大的一组素数对. 第一次想的是 ...
- 递归分治算法之二维数组二分查找(Java版本)
[java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...
- C语言查找算法之顺序查找、二分查找(折半查找)
C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...
- CUDA并行计算 | CUDA算法效率提升关键点概述
文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言 CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...
随机推荐
- SpringBoot初识日志
SpringBoot初识日志 1.市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j- 日志门面(日志的抽象层) 日志实现 SLF4j ...
- 基于B/S架构的在线考试系统的设计与实现
前言 这个是我的Web课程设计,用到的主要是JSP技术并使用了大量JSTL标签,所有代码已经上传到了我的Github仓库里,地址:https://github.com/quanbisen/online ...
- Java Mybatis快速入门之基本使用
目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...
- 【Linux】CentOS7中yumbackend.py进程的结束方法
环境: CentOS Linux release 7.3.1611 (Core) 今天启动这个不怎么用的机器,才启动,就发现后台的yum无法进行安装,持续报这个错误 Loaded plugins: f ...
- rac双节点+物理DG
注:以下文章均是看了黄伟老师的视频,记录为博客供以后使用. 双节点RAC搭建: http://blog.csdn.net/imliuqun123/article/details/76171289 RA ...
- ctfhub技能树—信息泄露—git泄露—Stash
打开靶机环境 查看页面内容 使用dirsearch进行扫描 使用Githack工具处理git泄露情况 进入.git/refs目录 发现stash文件,使用notepad++打开文件 使用git dif ...
- Docker-常用基建的安装与部署
一:Docker安装 1:通过yum安装docker yum -y install gcc yum -y install gcc-c++ yum remove docker \ docker-clie ...
- postman接口测试之复制多个接口或collections到某个子文件夹或collections下
一.痛点 1.postman只支持复制一个请求,或者一个子文件夹,但是不支持复制多个请求,或者整个collections到某个子文件夹或者某个collections下. 2.网上查了好一会儿,没有一个 ...
- MYSQL基础知识的复习2
1.修改表中的数据 update 表名 set 要修改的字段 where 条件;-- 如果修改多个字段那么字段和字段之间用逗号隔开 2.查询(很重要) 1.查询表中部分字段: select 字段名,字 ...
- 消息队列之rabbitmq学习使用
消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...