HDU 1431 素数回文(回文素数)

http://acm.hdu.edu.cn/showproblem.php?pid=1431

题意:

给你两个整数a,b。(5 <= a < b <= 100,000,000)要你按顺序输出[a,b]区间内的所有回文素数。

分析:

定理:如果一个数是回文且有偶数位,那么它能被11整除。

根据上面定理我们可知我们只需要找到区间[2,1000W)内的素数即可。(想想为什么)上面b的范围直接缩小了10倍。

剩下的工作就是用筛选法求出1000W内的所有素数,然后对于给定的a和b,我们对于[a,b]区间内的每个素数判断,看其是否是回文,如果是回文就输出。

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000000;

//求素数
bool flag[maxn];//flag[i]==true->i不是素数
int prime[1000000+5];
int get_prime()
{
    for(int i=2;i<=maxn;i++)
    {
        if(flag[i]==false) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
        {
            flag[prime[j]*i]=true;
            if(i%prime[j]==0) break;
        }
    }
    return prime[0];
}

//判断x是否回文
bool check(int x)
{
    int a=x;
    int b=0;
    while(a)
    {
        b=b*10+a%10;
        a/=10;
    }
    return b==x;
}

int main()
{
    get_prime();

    int a,b;
    while(scanf("%d%d",&a,&b)==2)
    {
        int L=lower_bound(prime+1,prime+prime[0]+1,a)-prime;
        for(int i=L;i<=prime[0] && prime[i]<=b;i++)
        {
            if(check(prime[i])) printf("%d\n",prime[i]);
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-11 21:27:18

HDU 1431 素数回文(回文素数)的相关文章

F题 hdu 1431 素数回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15041    Accepted Submission(s): 3359 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151

HDU 1431 素数回文(打表+技巧,最大回文素数为9989899!!!)

素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17512    Accepted Submission(s): 4033 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a

HDU 1431 素数回文

有人问我这个问题. 个人感觉暴搜会TLE O(n*sqrt(n)).n=100000000:(判断素数用2~sqrt(n)+1 去除) 还是枚举好了.枚举 1~10000,把他每一位存下来,回文数已知 left ,求 right ,然后组合起来. 例如 1 ,判断 11 是否素数. 例如 10 ,判断 101 是否素数, 判断 1001 是否素数. 这样复杂度就是 O(n^2). 开始我 bool pa[100000000] 准备用标记来确定.结果MLE. 然后算了一下 总共有多少个数,最多 7

HDU 1431 素数回文【暴力求解】

/* 题目大意:找一个范围内的所有素数回文数 解题思路:打一个表将1亿以内所有的素数回文数找出来,大概有780个这样子 关键点:暴力求解 解题人:lingnichong 解题时间:2014-08-29 12:02:55 解题体会:如果按一般方法打个素数表,很容易超内存(MLE),所以就先将所有的素数回文全部算出来,再在这个数组里面找在题上那个范围的所有素数回文数 */ 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 655

hdu 2710 Max Factor(找最大素数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2710 Problem Description To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) cows with a distinct serial number in the range 1..20,000. Unfortunately, he is unawa

HDU 1164 Eddy&#39;s research I【素数筛选法】

思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就可以了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6633    Accepted Submission(s): 3971 Problem Description Eddy's interest is very ext

HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)

GCD Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output t

题解报告:hdu 1431 素数回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 解题思路:这道题交了10次才A掉(怪菜鸡太弱...),刚开始是直接用欧拉筛算法模板+简单的判断回文,结果显示超内存...欧拉筛的时间复杂度可是O(n)线性时间...这样我重新解读题目,其最大范围是10的8次方,但多次小修改提交后还是超内存.于是直接用了暴力,结果显示超时,无奈将这两个算法结合在一起,结果还是显示超时.当看到题解之后才明白,欧拉筛(埃氏筛也一样)里面用到int数组开辟的空间比较占

hdu 1431 素数回文(暴力打表,埃托色尼筛法)

这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表,筛素数肯定用埃托色尼筛法(不好意思把大名鼎鼎的埃拉托色尼名字打错了,表打我). 再看当你所找的回文数的位数为偶数时,有如下定理除11外所有偶数位数的回文数都能被11整除,所以所有偶数位数的回文都不是素数. 证明看如下(我手写的) 手机像素渣(凑活着吧)字丑也凑和着. 证完后我们在来说题目给的数据范围 所以当