【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算法必定会让两类效率 ...
随机推荐
- Python在项目外更改项目内引用
前言 目前有一个奇葩的需求, 将某个开源项目整合进自己的项目里去调度, 还需要在每次启动这个开源项目时, 加载不同的配置文件进去, 问题是配置文件并不是一个 conf 或者是其他的什么, 而是以 .p ...
- 计算机考研复试真题 abc
题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...
- 【Java】计算机软件、博客的重要性、编程语言介绍和发展史
之前学得不踏实,重新复习一遍,打扎实基础中. 记录 Java核心技术-宋红康_2019版 & Java零基础学习-秦疆 文章目录 软件开发介绍 软件开发 什么是计算机? 硬件及冯诺依曼结构 计 ...
- SAP中的密码输入框
在SAP中的密码输入框,可分为两种情况: 1.用selection语句书写的选择屏幕上的密码输入框 实现的方式就是在AT SELECTION-SCREEN OUTPUT事件中写入如下代码: LOOP ...
- 指针锁定 Pointer Lock API 用法
指针锁定 Pointer Lock API 通过它可以访问原始的鼠标运动(基于指针的相对位移 movementX / movementY),把鼠标事件的目标锁定到一个特定的元素,同时隐藏视图中的指针光 ...
- 错误捕捉过滤器 .NetCore版
前言 继承ExceptionFilterAttribute后,重写OnException函数. 统一捕捉所有报错,格式化返回前端. 代码实现 基类控制器 在基类控制器上添加[ErrorCatch]特性 ...
- uwsgi 启动django
1, django 官方文档可配置项如下: 2,启动django 的配置: 1,和settings.py 同级目录下新建wsgi.py (该配置和manager.py 的配置基本是一样的) impo ...
- Windows Server 2008 R2系统安装
把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...
- 手把手做一个基于vue-cli的组件库(上篇)
基于vue-cli4的ui组件库,先贴个最终效果吧,步骤有点多,准备分上下篇,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.开工. GitHub源码地址:https://github.co ...
- Uber如何解决2000多个微服务带来的复杂性问题?
Uber如何解决2000多个微服务带来的复杂性问题? Adam Gluck 架构头条 2020-10-29 https://mp.weixin.qq.com/s/N7fVDZVm8uC9wVvd9DQ ...