何为"打表"呢,说得简单点就是:

  有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据的时候,直接遍历容器,检索这个数据是否有题意要求的结果。

  • 举一个几乎所有程序员都知道的简单例子= =:  求素数(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)的更多相关文章

  1. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。

    废话不多说,先上题目. 51nod Codeforces 两个其实是一个意思,看51nod题目就讲的很清楚了,题意不再赘述. 直接讲我的分析过程:刚开始拿到手有点蒙蔽,看起来很难,然后......然后 ...

  2. HDU4548美素数——筛选法与空间换时间

    对于数论的学习比较的碎片化,所以开了一篇随笔来记录一下学习中遇到的一些坑,主要通过题目来讲解 本题围绕:素数筛选法与空间换时间 HDU4548美素数 题目描述 小明对数的研究比较热爱,一谈到数,脑子里 ...

  3. POJ 3978 Primes(素数筛选法)

    题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...

  4. POJ 2689 Prime Distance (素数筛选法,大区间筛选)

    题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...

  5. LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)

    http://lightoj.com/volume_showproblem.php?problem=1259 题目大意:给你一个数n,这个数能分成两个素数a.b,n = a + b且a<=b,问 ...

  6. poj 2262 Goldbach's Conjecture(素数筛选法)

    http://poj.org/problem?id=2262 Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total ...

  7. HDU_2136——最大质因数,素数筛选法

    Problem Description Everybody knows any number can be combined by the prime number. Now, your task i ...

  8. PAT甲题题解-1059. Prime Factors (25)-素数筛选法

    用素数筛选法即可. 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄. 而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为i ...

  9. 甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)

    用vis标记出现过的id,checked标记询问过的id.至于如何判断排名为素数,用素数筛选法预处理一下即可,水题. #include <iostream> #include <cs ...

随机推荐

  1. 如何更好地利用Pmd、Findbugs和CheckStyle分析结果

    这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下: Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可能的bug— ...

  2. Notepad++的插件

    1.4. Notepad++中常用的插件 1.4.1. 插件管理器: Plugin Manager 插件功能:此插件可以帮你管理插件,包括查看当前已经安装的插件有哪些,以及自动帮你下载相应的插件. 插 ...

  3. LYDSY模拟赛day9 2048

    /* 大模拟题,做的时候思路还是比较清晰的 */ #include<iostream> #include<cstdio> #include<string> #inc ...

  4. Memcached原理分析

    Memcached的内存管理方式 Memcached采用了名为Slab Allocation的机制分配,管理内存. Slab Allocation的原理相当简单.将分配的内存分割成各种尺寸的块(chu ...

  5. nyoj 15 括号匹配(二)动态规划

    当时看到(二)就把(一)做了, 一很容易,这道题纠结了好几天,直到今晚才看懂别人的代码谢,勉强才写出来.................... 不愧是难度6的题. #include <stdio ...

  6. 新年新技术:MongoDB 3.0

    前一篇介绍了HTTP/2,这一篇简单介绍下3月3号发布的MongoDB 3.0. What’s new in MongoDB 3.0? 新的存储引擎WiredTiger MongoDB 3.0的存储引 ...

  7. Ubuntu10.04下安装Ns2的一系列错误及解决方案

    安装之前改一下nam1.11下的agent.h文件73行 Null改为0 第一个错误: xxx configuration: Syntax error: Unterminated quoted str ...

  8. JS跳转后台

    location.href = ROOT+"?"+VAR_MODULE+"=FaPiao&"+VAR_ACTION+"=dell&id ...

  9. php连接mysql

    一.php连接mysql的函数 1.mysql_connect 作用:连接mysql eg:$con=mysql_connect('localhost','root','123456'); 2.mys ...

  10. webrtc第一篇

    1.介绍 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器.乙和服务器之间建立信道.甲给乙发送消息时,甲 ...