USACO 1.5 Prime Palindromes

USACO 1.5 Prime Palindromes

dfs生成所有的奇数长度回环数,然后判断其是否为质数即可。
偶数长度的回环数都是11的倍数,只有11是质数,直接添加即可。
因为abba=a00a+bb0=a*1001+b0*1100=(a*99+b0)*11.其他可类推


#include  < iostream >
#include 
< fstream >
#include 
< cmath >
#include 
< vector >

using   namespace  std;

ifstream fin(
" pprime.in " );
ofstream fout(
" pprime.out " );

#ifdef _DEBUG
#define  out cout
#define  in cin
#else
#define  out fout
#define  in fin
#endif

bool  is_prime( int  num);

vector
< int > result;
int  a,b;

void  dfs( int  num, int  len)
{
    
if (len > 8 )
        
return ;

    
if (is_prime(num))
       result.push_back(num);

    
int  factor  =   1 ;

    
for ( int  i = 0 ;i < len; ++ i)
        factor
*= 10 ;

    
for ( int  i = 0 ;i < 10 ; ++ i){
        
// 左右各加一个i
         int  temp  =  factor * i;
        temp
+= num;
        temp
*= 10
        temp
+= i;
        dfs(temp,len
+ 2 );
    }
}

void  solve()
{
    
in >> a >> b;
    
    
for ( int  i = 0 ;i < 10 ; ++ i)
        dfs(i,
1 );

    
// 11直接加了
    result.push_back( 11 );

    sort(result.begin(),result.end());

    
for ( int  i = 0 ;i < result.size(); ++ i)
        
if (result[i] >= a && result[i] <= b)
        
out << result[i] << endl;
}

//  num>=2
bool  is_prime( int  num)
{
    
if (num == 2 return   true ;
    
    
int  root  =  ( int ) sqrt(num);

    
for ( int  i = 2 ;i <= root; ++ i)
        
if (num % i == 0 )
            
return   false ;

    
return   true ;
}


int  main( int  argc, char   * argv[])
{
  solve();
  
return   0 ;
}



你可能感兴趣的:(USACO 1.5 Prime Palindromes)