题意:给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(算法效率--线性筛素数+二分+测时)的更多相关文章

  1. poj 1411 Calling Extraterrestrial Intelligence Again(超时)

    Calling Extraterrestrial Intelligence Again Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  2. hdu 1239 Calling Extraterrestrial Intelligence Again (暴力枚举)

    Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  3. HDUOJ-----(1329)Calling Extraterrestrial Intelligence Again

    Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  4. 【HDOJ】1239 Calling Extraterrestrial Intelligence Again

    这题wa了很多词,题目本身很简单,把a/b搞反了,半天才检查出来. #include <stdio.h> #include <string.h> #include <ma ...

  5. 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 ...

  6. Calling Extraterrestrial Intelligence Again POJ 1411

    题目链接:http://poj.org/problem?id=1411 题目大意:找两个素数p,q满足a/b<=p/q<=1 且p*q<=m,求p*q最大的一组素数对. 第一次想的是 ...

  7. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

  8. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  9. CUDA并行计算 | CUDA算法效率提升关键点概述

    文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言   CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...

随机推荐

  1. 串口使用Pipeline时诡异的ReadOnlySequence问题

    借鉴之前的Pipeline的操作方式,现在目标是给串口读取操作也使用上Pipeline.稍微改造一下,以下代码可以直接运行. 协议为使用连续的4个0XFF作为结尾,没有头标志.数据总长为68位定长. ...

  2. kubernets之控制器之间的协作以及网络

    一  创建一个deployment的时候整个kubernets集群的资源和事件的调用链 1.1  创建一个deployment的资源,在提交的时候,集群中的调度器,控制器以及node节点上kubele ...

  3. kubernets之就绪探针

    一 介绍就绪探针 1.1  开始介绍就绪探针之前,让我们来提问几个问题?第一,在sevice这章我们了解到, 当流量从Ingress被转发到服务,然后服务从其维护当Endponits 里面列表查找到任 ...

  4. ctfhub技能树—信息泄露—备份文件下载—.DS_Store

    打开靶机 查看页面信息 使用dirsearch进行扫描 访问该网页,下载文件 使用Linux系统打开文件 发现一个特殊文件,使用浏览器打开 拿到flag 二.使用Python-dsstore工具查看该 ...

  5. Linux设置开机自动挂载镜像文件

    1.将文件上传到服务器上(本例上传到/Data/software下) 2.挂载 mount -o loop /Data/software/rhel-server-7.6-x86_64-dvd.iso ...

  6. django使用缓存之drf-extensions

    使用方法:1.直接添加装饰器@cache_response该装饰器装饰的方法有两个要求: 它必须是继承了rest_framework.views.APIView的类的方法 它必须返回rest_fram ...

  7. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...

  8. 转 12 jmeter性能测试实战--web程序

    12 jmeter性能测试实战--web程序   项目背景 项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds ...

  9. centos7服务器远程安装图形化页面

    以下是我用云的centos 7.4的安装步骤,照着我的命令操作肯定OK的,其他的就不敢保证了... 1.首先安装X(X Window System),命令为:(注意有引号) yum groupinst ...

  10. Correct the classpath of your application so that it contains a single, compatible version of org.thymeleaf.spring5.SpringTemplateEngine

    Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...