【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算法必定会让两类效率 ...
随机推荐
- Both Dolby Atmos driver and API need to be installed问题的一个解决方法
问题的原因在于缺少以下两个部分: Dolby Atmos driver:指你的声卡驱动中自带的杜比文件 如果驱动里没有,说明你的硬件可能不支持杜比,或者驱动太老没有包含杜比. Dolby Atmos ...
- Java并发编程实战(5)- 线程生命周期
在这篇文章中,我们来聊一下线程的生命周期. 目录 概述 操作系统中的线程生命周期 Java中的线程生命周期 Java线程状态转换 运行状态和阻塞状态之间的转换 运行状态和无时限等待状态的切换 运行状态 ...
- nodejs中的文件系统
. 目录 简介 nodejs中的文件系统模块 Promise版本的fs 文件描述符 fs.stat文件状态信息 fs的文件读写 fs的文件夹操作 path操作 简介 nodejs使用了异步IO来提升服 ...
- 【EXP】WINDOWS下如何导出
有些时候需要在windows下通过远程来导出数据 那么windows下怎么导出呢 例子: exp hr/hr@192.168.1.222:1521/zhang file=d:backup.dmp lo ...
- mysql—group_concat函数
MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Or ...
- layui表格前端格式化时间戳字段
layui.use(['util','table'], function(){ var table = layui.table; var util = layui.util; //... ...
- 获取网页url中的参数
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SUGA
愿试炼的终点是花开万里 愿以渺小启程伟大结束 ----闵玧其
- 阿姆达尔定律 Amdahl's law
Amdahl's law - Wikipedia https://en.wikipedia.org/wiki/Amdahl%27s_law 阿姆达尔定律(英语:Amdahl's law,Amdahl' ...
- 死锁案例 GAP 锁 没有就插入,存在就更新
https://mp.weixin.qq.com/s/2obpN57D8hyorCMnIu_YAg 死锁案例八 文 | 杨一 on 运维 转 | 来源:公众号yangyidba 一.前言 死锁其实是一 ...