美素数(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 ...
随机推荐
- sklearn中调用PCA算法
sklearn中调用PCA算法 PCA算法是一种数据降维的方法,它可以对于数据进行维度降低,实现提高数据计算和训练的效率,而不丢失数据的重要信息,其sklearn中调用PCA算法的具体操作和代码如下所 ...
- P1078 字符串压缩与解压
P1078 字符串压缩与解压 转跳点:
- Kubernetes Dashboard 【转】
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...
- Python测试进阶——(1)安装Python测试相关模块
安装python 安装pip yum -y install epel-release yum -y install python-pip 安装psutil 参考:https://www.cnblogs ...
- 使用JMX连接JVM
什么是JMX? 什么是JMX,Java Management Extensions,即Java管理扩展,是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以跨越一系列异构操作系统平台.系统体系 ...
- 选择本地文件上传控件 input标签
当要通过控件来选择本地文件上传的时候的一种方式 <input type="file" id="input-file"/> 注意 type类型一定要是 ...
- 99乘法表(for循环嵌套)
计算乘法表 两个数相乘,外层循环代表被乘数,控制行数:内层代表乘数,控制列数. 循环嵌套,变量名不可以重复. 使用 break 语句让输出的乘法表更简洁. 使用 String 变量,做 String ...
- SpringBoot-属性文件properties形式
SpringBoot-属性文件properties形式 上述使用JavaBean的配置可以实现数据源的配置,但是如果配置文件中的内容需要被多次调用就没那么方便了,所以我们学习新的方法,将Propert ...
- MYSQL 免安装版修改root密码
c:>mysql –uroot; mysql>show databases; mysql>use mysql;//不用修改 mysql>UPDATE user SET pass ...
- Elasticsearch 集群 - 健康检查
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...