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

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

  • 举一个几乎所有程序员都知道的简单例子= =:  求素数(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. 【转】随机函数的rand、srand用法

    from:深海的小鱼儿 地址:http://www.cnblogs.com/xmphoenix/archive/2011/04/07/2008622.html 随机函数的rand.srand用法 一& ...

  2. 优化PHP程序的方法(温故知新)

    1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化 ...

  3. 有利于SEO优化的DIV+CSS的命名规则小结

    可以先去这里温习一下CSS和HTML的知识!DIV+CSS规范命名大全集合  CSS开发技巧整理 一.CSS文件及样式命名 1.CSS文件命名规范 全局样式:global.css/master.css ...

  4. sql事务和锁

    摘自:http://www.cnblogs.com/lxconan/archive/2011/10/20/sql_transaction_n_locks_1.html 最近在项目中进行压力测试遇到了数 ...

  5. HDOJ 4389 X mod f(x)

    数位DP........ X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  6. jquery获取文本框的内容

    使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript <script type="text/javascript"> ...

  7. Sublim text2 的注册码

    1. Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F 942194A6 02396E9 ...

  8. Mac Pro 编译安装 PHP扩展 -- Swoole扩展

    回顾下先前的安装笔记: PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展? #下载 Swoole-1.8.10后,开始编译# cd /Users/jianbao/Downloads/s ...

  9. IDEA之google style配置(IDEA)

    一.window下IDEA配置谷歌编码规范xml 1.首先下载文件:intellij-java-google-style.xml(文件详细内容见附件) 2.找到该路径(C:\Users\自己的登录名 ...

  10. SQLite 数据库调研

    SQLite数据库的特点(转载的): ★技术上的优点和特性 SQLite是一个轻量级.跨平台的关系型数据库.既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图.事务.触发器等)就是理所当 ...