美素数(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去掉了
}
}
美素数(HDU 4548)(打表,简化时间复杂度)的更多相关文章
- HDU 4548 美素数(打表)
HDU 4548 美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...
- HDU 4548 美素数 在线打表加数状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548 解题报告:一开始本想先打个素数表,然后每次输入L 跟R 的时候都进行暴力判断,但这题测试数据太多 ...
- hdu 4548 筛法求素数 打表
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...
- 杭电(hdu)ACM 4548 美素数
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- HDU 4548(美素数)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 小明对数的 ...
- HDU 4548 美素数 素数题解
本题就是能够直接打表的,推断能否够打表也须要技巧的: 1 推断最大的数值为1000000.百万下面的数打表都是能够的 2 能够线性预处理好.使用素数筛子法是能够接近线性预处理的. 故此能够打表了. 须 ...
- HDU 4548:美素数
Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素 ...
- hdu 4548 美素数 超级大水题
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- hdoj 4548 美素数 【打表】
另类打表:将从1到n的满足美素数条件的数目赋值给prime[n],这样最后仅仅须要用prime[L]减去prime[R-1]就可以: 美素数 Time Limit: 3000/1000 MS (Jav ...
随机推荐
- Django(十九)文件上传:图片上传(后台上传、自定义上传)、
一.基本设置 参考:https://docs.djangoproject.com/zh-hans/3.0/topics/http/file-uploads/ 1)配置project1/settings ...
- 继OpenJDK 之后,OpenJFX也将迁移到 Git
导读 近日 OpenJFX 项目负责人 Kevin Rushforth 提交了一份将 OpenJFX 迁移到 GitHub 的提案. OpenJFX 是 JavaFX 的开源实现.JavaFX 是一个 ...
- spring-boot-autoconfigure-xx.jar核心注解
- 从零开始学C++(1 变量和基本类型)
接下来的几篇文章介绍C++的基础知识点. C++是一种静态数据类型语言,它的类型检查发生在编译时.因此,编译器必须知道程序中每一个变量对应的数据类型. 数据类型是程序的基础:它告诉我们数据的意义以及我 ...
- UVA 12511/CSU 1120 virus 最长公共上升子序列
第一次接触一个这最长公共上升子序列 不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙 两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A[i]小的最大值+1.弄个临时变量记录最 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-pencil
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Jmeter安装插件Stepping Thread Group
下载链接:https://jmeter-plugins.org/downloads/old/ 下载解压后,将JMeterPlugins-Standard.jar包放在jmeter安装目录的jmeter ...
- 索尼研发的新主机竟兼容现款PSVR!
索尼PlayStation研发负责人Dominic Mallinson在接受媒体记者采访时表示,现款PSVR头戴式虚拟现实装置可用于下一代PS主机. 新主机兼容现款PSVR 而且,即便新主机上市也不要 ...
- 【LeetCode】重新安排行程
[问题]给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所 ...
- jQuery通过name获取值
使用jQuery获取name="day"的input对象: 方法1 var dayObj=$('input[name="day"]'); for(int i=0 ...