ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)
何为"打表"呢,说得简单点就是:
有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据的时候,直接遍历容器,检索这个数据是否有题意要求的结果。
- 举一个几乎所有程序员都知道的简单例子= =: 求素数(POJ 1595)-Prime cuts
这一题大意是给出 多组N(1~1000)和C,让你从N内素数的中间项向外扩展C个素数,比如给出7 1,素数有5个(注意此题出题人坑爹得让1作为"素数") 1,2,3,5,7,那么应输出7 1:3 5 7(注意输出格式)
特别的,偶数个素数输出2c-1个,奇数个则输出2c个。
那么有几点我们是需要分析的:
- N的数据范围小,但可能数据量较大,看起来貌似只有1000内的素数,但如果给出上万组数据,用蛮横的办法,每次都把素数求解出来然后去统计中间值,然后扩展,显然是不明智的,容易TLE。
- 应当注意特判:C如果大于实际素数范围,那么我们应当输出所有素数,这个地方没有处理好,容易WA。
- 注意输出扩展的素数的上下限,也注意不要超出最大素数(<=1000),discuss区有人说测试数据可能大于1000可能是他自己没有处理好这个问题。
第二,三点是细节问题,但是第一点则是算法优化问题了,常见的素数算法优化就是:打表法 and 筛选法。
- 打表法:在处理问题前先把所有可能的素数单独用数组做标记,然后在处理问题时查找相应的素数就行了,省去了重复统计素数的时间。
- 筛选法:标记范围内所有合数(基本思路就是:有两数:i,j(i,j>=2),那么i*j一定是合数,这样当 i 在遍历到这些合数时就可以跳过不进行运算了)
Code附上:
//素数打表(筛选法)
//Memory: 140 K,Time: 0 Ms
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; #define MAX 1005 int prime[MAX],pl;
int num[MAX]; /*筛选法素数打表*/
void prime_number(int max_num)
{
int i,j;
int k = (int)sqrt(1.0*max_num); //开方-四舍五入 /*标记所有合数*/
for(i=;i <= k;i++)
{
if(!num[i])
for(j = *i; j<=max_num; j+=i)
num[j] = ;
} /*打表*/
pl = ; //素数计数器
for(i=;i <= max_num;i++) //ps:此题"素数"包括1
{
if(!num[i])
prime[pl++] = i;
}
return;
} int main()
{
int n,c;
int i; prime_number(MAX); //先打好最大素数表 while(~scanf("%d%d",&n,&c))
{
/*找到素数区间*/
for(i = ; i < pl; i++)
{
if(n < prime[i])
break;
}
int maxp = i-; printf("%d %d:",n,c);
if(maxp%) //奇数个
{
int mid = (maxp+)/;
if(*c- > maxp)
c = mid; for(i = mid-c+; i <= mid+c-; i++)
printf(" %d",prime[i]);
}
else //偶数个
{
int mid = maxp/;
if(*c > maxp)
c = mid; for(i = mid-c+;i <= mid+c; i++)
printf(" %d",prime[i]);
}
printf("\n\n");
} return ;
}
Loading...
ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)的更多相关文章
- 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。
废话不多说,先上题目. 51nod Codeforces 两个其实是一个意思,看51nod题目就讲的很清楚了,题意不再赘述. 直接讲我的分析过程:刚开始拿到手有点蒙蔽,看起来很难,然后......然后 ...
- HDU4548美素数——筛选法与空间换时间
对于数论的学习比较的碎片化,所以开了一篇随笔来记录一下学习中遇到的一些坑,主要通过题目来讲解 本题围绕:素数筛选法与空间换时间 HDU4548美素数 题目描述 小明对数的研究比较热爱,一谈到数,脑子里 ...
- POJ 3978 Primes(素数筛选法)
题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...
- LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)
http://lightoj.com/volume_showproblem.php?problem=1259 题目大意:给你一个数n,这个数能分成两个素数a.b,n = a + b且a<=b,问 ...
- poj 2262 Goldbach's Conjecture(素数筛选法)
http://poj.org/problem?id=2262 Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total ...
- HDU_2136——最大质因数,素数筛选法
Problem Description Everybody knows any number can be combined by the prime number. Now, your task i ...
- PAT甲题题解-1059. Prime Factors (25)-素数筛选法
用素数筛选法即可. 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄. 而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为i ...
- 甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)
用vis标记出现过的id,checked标记询问过的id.至于如何判断排名为素数,用素数筛选法预处理一下即可,水题. #include <iostream> #include <cs ...
随机推荐
- 【8-18】JS学习01
Source : http://www.w3school.com.cn/html 外部的 JavaScript 也可以把脚本保存到外部文件中.外部文件通常包含被多个网页使用的代码. 外部 JavaSc ...
- hdu4950 Monster (水题)
4950 Monster Monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HTTP报文详解
二.HTTP请求首部字段 1 Accept 2 Accept-Charset 3 Accept-Encoding 4 Accept-Language 5 Authorization 6
- 使用Minify来优化网站性能
Minify 是用PHP5开发的应用,通过遵循一些Yahoo的优化规则来提高网站的性能.它会合并多个CSS或者JavaScript文件,移除一些不必要的空格和注释,进行gzip压缩,并且会设置浏览器的 ...
- VTK初学一,b_PolyVertex_CellArray多个点的绘制
#ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRend ...
- codevs2574 波兰表达式
题目描述 Description 对于 加.减.乘.除这种四则运算的表达式,我们使用的是先乘除.后加减的从左到右的顺序进行运算,如果要指定特定的顺序,就要增加括号进行表达,比如 (A+B)*C , A ...
- C++ Const引用详解
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...
- 如何利用cookie来保存用户登录账号
众所周知,cookie在网页编写中不接或缺,今天就谈谈如何利用cookie技术来保存用户登录账号 1.首先是否保存用户登录账号当然是用户自行决定,所以我们需要在用户登录界面设置一个复选框,以此取得用户 ...
- 【C语言入门教程】5.5 实现问题(效率)
在设计函数时需要遵循一些基本原则,因为影响到函数的执行效率和可用性.函数是代码复用的基础,一个健壮的函数或由函数组成的函数集可以在多个程序中使用.C语言标准库里存放的就是这样的函数,这些函数被放置在头 ...
- ajax 请求多张图片数据
需求分析: 实现对网页上的图片进行显示.由于读取图片名称相同,而图片内容已发生改变.采用网上所用的要求浏览器不缓存的操作不生效 <META http-equiv="Pragma&quo ...