usaco Prime Palindromes

给定两个边界,求输出所有这个边界以内,既是素数又是回文的数字;

一开始用的素数筛,爆内存了。

改为生成回文后检测是否为素数,在如何递归生成回文上卡了很久。一直纠结于边界情况的处理。

/*
ID: modengd1
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <math.h>
using namespace std;
typedef long long ll;
long long A,B;

bool IsPrime(int x)
{
    if(x==2)
        return true;
    if(x%2==0)
        return false;
    for(int i=3;i*i<=x;i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}
void slove(int deep,int limit,int fro,int tair)//deep为当前回文串的长度,limit为要求的回文串的长度,fro为生成的回文串的前半部分,tair为后半部分,当前后不一样长时将中间的数字划分到前半部分
{
    int ans;
    if(deep==limit)
    {
        ans=fro*pow(10,(deep/2))+tair;      
        if(ans<A||ans>B)//检查是否超出边界
            return;
        if(IsPrime(ans))
        {
            cout<<ans<<endl;
        }
        return;
    }
    if((limit-deep)==1)//如果需要求的回文串长度为奇数,且已经生成了除最中间的数字以外的前后两部分之后
    {
        for(int i=fro==0?1:0;i<10;i++)
        {
            slove(deep+1,limit,fro*10+i,tair);
        }
    }
    else//给fro的末尾加一个数字,给tair的前面加相同的数字
    {
        for(int i=fro==0?1:0;i<10;i++)
        {
            slove(deep+2,limit,fro*10+i,pow(10,(deep/2))*i+tair);
        }
    }

}
int main()
{
    freopen("pprime.in","r",stdin);
    freopen("pprime.out","w",stdout);
    cin>>A>>B;
    int st,en;  //得出边界的位数
    for( st=0;A>pow(10,st);st++);
    for( en=0;B>pow(10,en);en++);
    for(int i=st;i<=en;i++)
    {
        slove(0,i,0,0);
    }
    return 0;
}

  

时间: 2024-12-11 06:07:20

usaco Prime Palindromes的相关文章

USACO Prime Palindromes 构造回文数

这道题目一点也不卡素数的判断 就是朴素的sqrt(n) 也不卡 所以~放心的用吧. 构造回文的时候看了HINT 其中是这么写的: Generate palindromes by combining digits properly. You might need more than one of the loops like below. /* generate five digit palindrome: */ for (d1 = 1; d1 <= 9; d1+=2) { /* only odd

USACO Prime Palindromes(dfs)

题目请点我 题解: 这道题看起来是一道很简单的题目,但是数据量很大.如果暴力判断会超时,预处理筛法标记素数则会超内存.最后看了网上的解法才知道要逆推,生成回文数,这还是要第一次遇到.并且很重要的一点是偶数位的回文数都能被11整除,所以只需要生成奇数位的,偶数位回文素数符合情况的值可能有11一个.挺考验思维的,重要的是do mathmatics first. 代码实现: /* ID: eashion LANG: C++ TASK: pprime */ #include <iostream> #i

USACO 1.5 Prime Palindromes

Prime Palindromes The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a a

luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 5 500 输出样例#1: 5 7 11 101

P1217【洛谷FromUSACO】[USACO1.5]回文质数 Prime Palindromes

直接上题——[传送门:http://www.luogu.org/problem/show?pid=1217] 题目来源USACO,NOCOW翻译,洛谷转载,懂(F_Q)的童鞋们可以去USACO官网逛逛……<!———————————下面是原题—————————————————————————————--> P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 复制 5 500 输出样例#1: 复制 5 7

hoj 1004 Prime Palindromes(还是不够完美)

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b

codechef Prime Palindromes 题解

给定一个数,求一个新数要大于等于这个数,而这个新数既要是palindromes回文又要是prime素数. 题目很简单,有人都使用取巧的方法保存好结果直接查表. 或者暴力法求解. 这里不使用保存表的方法,也不要用暴力法.- 这些方法都不好. 使用的技巧有: 1 而是使用next palindrome的技巧,只需要O(n),n是数位,可以认为是常数了. 2 判断素数的方法,时间效率是O(sqrt(n)), n是数值大小,如果是重复判断很多数是否是素数是有办法优化的,但是如果是单个素数判断的话,我还想

USACO Section1.5 Prime Palindromes 解题报告

pprime解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 求a到b之间的所有回文素数(即又是素数又是回文数的数).[数据范围] 5<=a,b<=100,000,000[输入样例] 5