数学#素数筛法 HDU 4548&POJ 2689
找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法。
素数筛法 打表伪代码(用prime数组保存区间内的所有素数):
void isPrime()
vis[]数组清零;//vis[]数组用于标记是否已被检验过
prime[]数组全赋初值false;//prime[]数组从下标0开始记录素数
for i = 2 to MAXN (i++)
if 数i未被检验过
prime[tot++]=i;
for j = i*i to MAXN (j+=i) //j是i的倍数
标记该数已被否定,不是素数 //vis[j]=1;
最先做的是hdu的美素数,要求数n本身就是素数,而且n的各位数之和亦是素数,先打表,再进行素数筛法;函数cnt()中用到了dp思想;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000005;
int ans[MAXN];
bool prime[MAXN]; void isPrime()
{
memset(ans,0,sizeof(ans));
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<MAXN;i++)
{
if(!prime[i])
continue;
for(int j=i*2;j<MAXN;j+=i)
prime[j]=false; //point!
}
} int addWei(int n)
{
int sum=0;
while(n)
{
sum+=n%10;
n/=10;
}
return sum;
} void cnt()
{
ans[0]=ans[1]=0;
for(int i=2;i<MAXN;i++)
{
if(prime[i]&&prime[addWei(i)])
ans[i]=ans[i-1]+1;
else ans[i]=ans[i-1];
}
} int main()
{
int t,l,r;
isPrime();
cnt();
scanf("%d",&t);
for(int ca=1;ca<=t;ca++)
{
scanf("%d %d",&l,&r);
printf("Case #%d: %d\n",ca,ans[r]-ans[l-1]);
}
return 0;
}
第二道是poj上一道二次筛法的题目,如何进行二次素数筛,见下面代码:
参考此博:http://blog.csdn.net/a601025382s/article/details/12111297
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
//这个解法比较慢,但是好理解,其他快的暂时还理解不了
const int N=47000; ll l,u,prime[N];
int tot;
int vis[N],ans[10000005]; void isPrime()
{
tot=0;
memset(vis,0,sizeof(vis));
memset(prime,0,sizeof(prime));
for(ll i=2;i<N;i++)
{
if(!vis[i])
{
prime[tot++]=i;
for(ll j=i*i;j<N;j+=i)
vis[j]=1;
}
}
} int main()
{
ll pre,maxn,u1,v1,minn,u2,v2;
int flag; isPrime();
while(~scanf("%I64d%I64d",&l,&u))
{
if(l<=1)
l=2;//1既不是素数,也不是合数 //二次筛选
memset(ans,0,sizeof(ans));
for(int i=0;i<tot&&prime[i]<=u;i++)
{
ll t=l/prime[i]+(l%prime[i]>0);
if(t==1) t++;
for(ll j=t*prime[i];j<=u;j+=prime[i])
ans[j-l]=1;
} maxn=-2*N;minn=2*N;
flag=0;
for(ll i=l;i<=u;i++)
{
if(!ans[i-l])
{
flag++;
if(flag>1)
{
int temp=i-pre;
if(temp>maxn)
{
maxn=temp;
u1=pre;v1=i;
}
if(temp<minn)
{
minn=temp;
u2=pre;v2=i;
}
}
pre=i;
}
}
if(flag>1)
printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",u2,v2,u1,v1);
else printf("There are no adjacent primes.\n");
}
return 0;
}
数学#素数筛法 HDU 4548&POJ 2689的更多相关文章
- 美素数(HDU 4548)(打表,简化时间复杂度)
相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...
- POJ 2689 筛法求素数
DES:给出一个区间[L, U].找出这个区间内相邻的距离最近的两个素数和距离最远的两个素数.其中1<=L<U<=2147483647 区间长度不超过1000000. 思路:因为给出 ...
- HDU 4548 美素数(打表)
HDU 4548 美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
- 大区间素数筛选(POJ 2689)
/* *POJ 2689 Prime Distance *给出一个区间[L,U],找出区间内容.相邻的距离最近的两个素数和距离最远的两个素数 *1<=L<U<=2147483647 ...
- hdu6069(简单数学+区间素数筛法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 给出 l, r, k.求:(lambda d(i^k))mod998244353,其中 ...
- POJ 3292 Semi-prime H-numbers (素数筛法变形)
题意:题目比较容易混淆,要搞清楚一点,这里面所有的定义都是在4×k+1(k>=0)这个封闭的集合而言的,不要跟我们常用的自然数集混淆. 题目要求我们计算 H-semi-primes, H-sem ...
- HDOJ 6069 素数筛法(数学)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
随机推荐
- 开学&东大一周游记
明天就要离开生活但并没有学到多少东西的东大了,不舍,这是真的,因为真的是没学到多少就要走了.但是终归是有收获的,比如感受到了舍长这样的大牛的学习态度,东大的浴池真的很棒,我很感激吉大的伙食诸如此类.感 ...
- HTML学习总结(四)【canvas绘图、WebGL、SVG】
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- Jquery 操作DropDownList 根据条件选中
$("#<%=DDLCounty.ClientID%> option").each(function () { if ($(this).text() == $(&quo ...
- Shell 脚本计算时间差
在shell脚本中统计程序执行完毕所需要的时间不像在java中使用System.currentTimeMillis()方便 稍微记录一下,以供备用,免得又去花时间想(统计程序执行消耗多少s): sta ...
- [Q]复制授权了文件但仍显示“未注册”问题(安装在非默认目录或目录包含中文)
1. 注意要将解压后的文件复制到CAD批量打图精灵安装目录,而不要复制文件夹,复制是提示是否需要覆盖,要选择覆盖. 2. 若通过第1步操作仍然显示“未注册”,则可能是由于安装目录含有中文或者不是默认目 ...
- [Q]pdfFactory打印机内存不能为read的问题
运行环境:xp系统,AutoCAD2007 1. 使用pdfFactory打印文本文件没有问题. 2. 使用CAD打印的时候出现问题,使用CAD自带的PLOT命令打印也出现相同的问题. 3. 使用相同 ...
- 8.MyBatos的动态Sql
1.创建javaWeb项目MyBatis_dynamicSQL并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17. ...
- ResScope (软件资源分析)V1.94 绿色版
软件名称:ResScope (软件资源分析)V1.94 绿色版软件类别:国产软件运行环境:Windows软件语言:简体中文授权方式:免费版软件大小:1.47 MB软件等级:整理时间:2015-01-0 ...
- WinForm ListView
今天,我学习了公共控件中的ListView的内容. 首先,在利用ListView布置界面时,有以下三个方面: 1.视图: 在其右上方小箭头点击将视图改为Details:或者右键属 ...
- JavaScript中时间戳和时间的相互转换
时间转换成时间戳: var time = new Date(); var timestamp=Date.parse(time) //毫秒数,得到秒除以1000: 时间戳转成时间: 1.转换成 20 ...