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

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

  • 举一个几乎所有程序员都知道的简单例子= =:  求素数(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. java获取指定路径下的指定文件/java.io.File.listFiles(FilenameFilter filter)

    java.io.File.listFiles(FilenameFilter filter) 返回抽象路径名数组,表示在目录中此抽象路径名表示,满足指定过滤器的文件和目录. 声明 以下是java.io. ...

  2. python 运行时报错误SyntaxError: Non-ASCII character '\xe5' in file 1.py on line 2

    File "1.py", line 2SyntaxError: Non-ASCII character '\xe5' in file 1.py on line 2, but no ...

  3. Sublime Text 2 快捷键 (windows)

    转自:http://istyles.blog.163.com/blog/static/1811003892011828111418654/ Lucifr翻译了 Sublime Text 2 快捷键 M ...

  4. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  5. hdu4923 Room and Moor

    4923Room and Moor Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/2621 ...

  6. 导航菜单:jQuery粘性滚动导航栏效果

    粘性滚动是当导航在滚动过程中会占粘于浏览器上,达到方便网站页面浏览的效果,也是一种用户体验,下面我们看一下是怎么实现的: jQuery的 smint插件,也是一个导航菜单固定插件.当页滚动时,导航菜单 ...

  7. 【AngularJS】—— 9 自定义过滤器

    AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...

  8. 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX

    从网上抓了一些字节流,想打印出来结果发生了一下错误: UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position ...

  9. 清北暑假模拟day2 将

    /* 爆搜,正解弃坑 */ #include<iostream> #include<cstdio> #include<string> #include<cst ...

  10. 遇到了IAR烧写程序出错,附解决办法The stack plug-in failed to set a breakpoint on "main"

    今天做无线串口调试的时候用IAR7.51往CC2530无线模块烧程序的时候遇到了问题: 先是下载过程中有许多警告,然后就是提示无法跳断点,找不到main方法,每次烧程序都出现: The stack p ...