【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算法必定会让两类效率 ... 
随机推荐
- 解锁Renderbus客户端使用新技巧----快速渲染效果图篇
			度娘说,效果图最基本的要求就是:应该符合事物的本身尺寸,不能为了美观而使用效果把相关模型的尺寸变动,那样的效果图不但不能起到表现设计的作用,反而成为影响设计的一个因素.可见高效渲染效果图是都是当下我们 ... 
- oracle坚决不挂01(表,索引,视图的创建,修改,删除,查询)
			考试快来了,来篇oracle干货,复习一下(挣扎一下) 废话不多说,开始写! 这篇是数据库对象的有关操作的总结! 数据库对象有熟悉的表,视图,索引,序列,同义词等(这个oracle东西真不少,小声bb ... 
- Docker  Java 镜像基础(四)
			基于官方提供的centos 7.2.1511 基础镜像构建JDK 和tomcat 镜像,先构建JDK镜像,然后在基于JDK镜像构建tomcat镜像 构建 centos:latest 基础镜像: # 下 ... 
- Openstack glance 镜像服务 (五)
			Openstack glance 镜像服务 (五) 引用: 官方文档glance安装 https://docs.openstack.org/ocata/zh_CN/install-guide-rdo/ ... 
- linux服务开机自启动&注册系统服务
			首先先看下linux系统开机启动顺序,如下图 对,要解决Linux CentOS 和 Red Hat Linux 系统中设置服务自启动有两种方式,就是从图中圈出的两个步骤下手. 一.修改 /etc/r ... 
- 【Linux】CentOS4 系统最后的网络yum源
			------------------------------------------------------------------------------------------------- | ... 
- 【ORA】ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
			ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode 这个问题是rman备份的时候,发现有问题 原因: 数据库没有开启归档 ... 
- [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
			转载自:http://www.cnblogs.com/joeblackzqq/p/4526589.html From: http://m.blog.csdn.net/blog/langkeziju/1 ... 
- kubernets之Ingress资源
			一 Ingress集中式的kubernets服务转发控制器 1.1 认识Ingress的工作原理 注意:图片来源于kubernets in action一书,如若觉得侵权,请第一时间联系博主进行删 ... 
- oracle关闭监听log.xml文件生成步骤
			1.查看sqlnet.ora文件是否存在 cd $ORACLE_HOME/network/admin ls 如果不存在,copy一个过来 cp samples/sqlnet.ora . 2.修改sql ... 
