Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- using namespace std;
- int p10[] = {1,10,100,1000,10000,100000,1000000,10000000};
- const int BOUND = 1000001;
- bool is_prime[BOUND];
- int digits[] = {1,3,7,9};
- int digit_count(int n){ return n > 9 ? 1 + digit_count(n / 10) : 1; }
- bool is_circular(int n){
- int d = digit_count(n);
- for( int i = 0; i < d; i++ ){
- if( !is_prime[n] ) return false;
- n += (n%10) * p10[d];
- n /= 10;
- }
- return true;
- }
- int circular_count(int n = 0){
- int ret = 0;
- if( n < BOUND ){
- if( is_circular(n) ) ret++;
- for( int i = 0; i < 4; i++ ) ret += circular_count(10*n + digits[i]);
- }
- return ret;
- }
- void calc_sieve(){
- fill(is_prime,is_prime+BOUND,true);
- is_prime[0] = is_prime[1] = false;
- for( int p = 2; p*p < BOUND; p++ ) if( is_prime[p] ){
- for( int m = p*p; m < BOUND; m += p ) is_prime[m] = false;
- }
- }
- int main(){
- calc_sieve();
- cout << circular_count() + 2 << endl;
- }
Add Comment
Please, Sign In to add comment