Description

The cows are forever competing to see who has the best brand. The latest rage is brands that are ‘Wonderprimes’. You probably already know that a brand consists of a sequence of digits that does not begin with 0; brands actually look a lot like positive integers.
A wonderprime is a number that can be partitioned into two prime numbers, each of which has at least D digits and, of course, doesn’t start with 0. When D=2, the number 11329 is a wonderprime (since it connects 113 and 29, both of which are prime).
Only a few of the cows have wonderprime brands, but they all want one. Your job is to find the first wonderprime greater than or equal to a supplied integer N (1 <= N <= 2,000,000,000). No integer greater than 2,000,000,000 will be required.

Input

Line 1: Two space-separated integers: D and N

Output

Line 1: A line that contains the first wonderprime no smaller than N.

Example Input

2 11328

Example Output

11329

Solution

纯枚举

#include <bits/stdc++.h>
#define ll long long

using namespace std;

ll d, n, mod(10), minimum(1);

bool prime(ll x);

bool iskey(ll x);

int main()
{
    scanf("%lld%lld", &d, &n);
    for (ll i = 1; i < d; i++) { mod *= 10; minimum *= 10; }
    if (n < mod * minimum) n = mod * minimum;
    while (!iskey(n)) n++;
    printf("%lld\n", n);;
    
    return 0;
}

bool prime(ll x)
{
    if (x < 2) return false;
    for (ll i = 2; i * i <= x; i++)
        if (x % i == 0) return false;
    return true;
}

bool iskey(ll n)
{
    ll x = n / mod, y = n % mod, pow = mod;
    if (n % mod / minimum)
        if (prime(x) && prime(y))
            return true;
    y += x % 10 * pow; x /= 10;
    while (x >= minimum)
    {
        if (y >= pow)
        {
            if (prime(x) && prime(y))
                return true;
        }
        pow *= 10;
        y += x % 10 * pow; x /= 10;
    }
    return false;
}