美素数(HDU 4548)(打表,简化时间复杂度)
相信大家都喜欢美的东西,让我们一起来看看美素数吧。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input 第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。 Output 对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。 Sample Input
3 1 100 2 2 3 19
Sample Output
Case #1: 14 Case #2: 1 Case #3: 4
思路应该是很清晰的:十进制数是素数、它的各位数字和也是素数,这两个一判断就OK了。
但是因为数据很多还是会出现很多问题的,比如说超时,这时就需要我们打表了。
这里不要想着用筛法求素数,容易超时。
这是最开始的代码,一直超时
#include<cstdio>
#include<cstring>
using namespace std;
const int Max=1000005;
bool Mprime[Max];
int isprime(int a){int flag=1;for(int i=2;i*i<a;i++)if(a%i==0){flag=0;break;}return flag;
}
int add(int a){int flag=0,sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) flag=1;return flag;
}
int main()
{int t,l,r;memset(Mprime,0,sizeof(Mprime));for(int i=2;i<Max;i++){ //注意1不是素数,要从二开始 if(add(i)&&isprime(i)) Mprime[i]=1;}scanf("%d",&t);for(int j=1;j<=t;j++){int sum=0;scanf("%d%d",&l,&r);for(int i=l;i<=r;i++){ //这里每输入一组数据就要循环一次,如果每次输入数据间隔很大必然超时if(Mprime[i]) sum++;}printf("Case #%d: %d\n",j,sum);}
}
上代码:
#include<cstdio>
#include<cstring>
#include<cmath>
const int Max=1000005;
int sum[Max],p[Max]; //sum[i]存储比i小的素数的个数
int isprime(int a){for(int i=2;i<=sqrt(a);i++) //sqrt很重要,如果不用结果会不正确,因为如果用i*i可能会溢出if(a%i==0) return 0;return 1;
}
int add(int a){int sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) return 1;return 0;
}
int main()
{int t,l,r; for(int i=2;i<Max;i++){ //注意1不是素数,要从二开始 if(add(i)&&isprime(i))p[i]=1;sum[i]=sum[i-1]+p[i]; //先填充数组p,在填充数组sum,即用两个循环也不会超时}scanf("%d",&t);for(int j=1;j<=t;j++){scanf("%d%d",&l,&r);printf("Case #%d: %d\n",j,sum[r]-sum[l-1]); //一定是l-1,不然就把l去掉了}
}
转载于:https://www.cnblogs.com/RenoStudio/p/10355228.html
美素数(HDU 4548)(打表,简化时间复杂度)相关推荐
- HDU 4548 美素数(打表)
HDU 4548 美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...
- HDU 4548 美素数 素数题解
本题就是能够直接打表的,推断能否够打表也须要技巧的: 1 推断最大的数值为1000000.百万下面的数打表都是能够的 2 能够线性预处理好.使用素数筛子法是能够接近线性预处理的. 故此能够打表了. 须 ...
- HDU 4548 美素数
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- 杭电 4548 美素数
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- HDU4548 美素数【水题】
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- ACM 美素数 (没AC)
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数" ...
- 【ACM】杭电OJ 4548 美素数(二次打表)
二次打表,第一次是标记哪些是素数,哪些不是. 第二次是前n个数中 "本身是素数 && 各个位上的和是素数 " 的个数 TLE: #include < ...
- 数学--数论--HDU - 6322 打表找规律
In number theory, Euler's totient function φ(n) counts the positive integers up to a given integer n ...
- 【CodeForces - 271B 】Prime Matrix (素数,预处理打表,思维)
题干: You've got an n × m matrix. The matrix consists of integers. In one move, you can apply a single ...
最新文章
- js实现轮播图,模拟flash上下滚动(原生JS,没有任何框架)
- 计算机桌面黑屏时间,电脑自动黑屏时间怎么调?
- Python 操作Word文档插入图片和表格实例演示
- java ctp行情_java-ctp
- Servlet使用基本步骤及功能实现
- 【模拟】表达式求值(jzoj 1768)
- 搜索框中“请输入搜索keyword”
- (转)Managed DirectX +C# 开发(入门篇)(一)
- 二十三种设计模式之工厂模式(含Java工厂模式的实现)
- 企业如何搭建商业智能BI,过程中又需要注意哪些事项
- 【库房】DateTime.Now.Date和DateTime.Now.TimeOfDay的用法
- 2019腾讯游戏客户端面试
- Xshell 免密连接云主机(以Vultr云服务为例)
- webservice java接口远程调用
- 2021年起重机司机(限门式起重机)考试及起重机司机(限门式起重机)找解析
- 国家医保的线上支付接口,需要签名算法SM2、加密算法SM4
- PYQT5水平布局后垂直方向控件间距的调整方法
- python定时器库_python定时器示例代码
- Codeforces积分系统介绍
- 立过的Flag——成为博客专家
热门文章
- 计算机屏幕显示电缆借口,电脑关机后显示器显示请检查电缆接口怎么办成功解决...
- java获取map大小_java – 从HashMap获取最大Set大小
- MacOS下保护浏览器主页和默认搜索
- Pixhawk---超声波模块添加说明(I2C方式)
- 瀑布式开发、迭代式开发、螺旋开发、敏捷开发四种开发模式的区别
- 磁盘文件读写和数据库读写哪个效率更高
- 深入理解 Linux的 I/O 系统
- android 百度定位开启后fragment 不显示,解决Android百度地图MapView在ViewPager中Fragment切换黑屏问题...
- c++内存管理-分配失败
- 使用内置的Gallery应用程序选择图形