Problem:
問題５
Ｊ中学校の運動会で次のようなクラス対抗の競技を行なうことになった． 
各クラスから生徒代表の男女 n ペア
(男子生徒 b
1
， 女子生徒 g
1
)， (男子生徒 b
2
， 女子生徒 g
2
)， … ， (男子生徒 b
n
， 女子生徒 g
n
)
を選び，
0 から 9 までの数字が書かれた旗を自由に選んでもらい 
（それぞれの旗は十分な個数ある）， 
横一列に並んでもらう． 
ただし， 
ペアになっている男子生徒と女子生徒は同じ番号の旗を一人１つずつ 
選ばなければならず，
 並び順は
b
1
b
2
… b
n
c g
n
… g
2
g
1
のように，
男子生徒達 n 人の並び順 
b
1
b
2
… b
n
とは逆の順番 
g
n
… g
2
g
1
で女子生徒達は
並ばなければならない． 
中央の c には， 
クラス担任の先生があらかじめ審判長によって指定された
番号の付いた旗を持って立つ場合と， 
立たないことを審判長に指定される場合とがある．
こうして並んだ生徒達（と先生）が持った旗の番号
を 2n 桁（または 2n+1 桁）の整数と考えたとき， 
それが素数である方が勝ちである． 
ただし， 
両クラスとも素数だった場合あるいは両クラスとも素数でなかった場合には， 
数が大きい方が勝ちである． また，
0 b
2
… b
n
c g
n
… g
2
0
 　あるいは　 
0 b
2
… b
n
g
n
… g
2
0
のように先頭に 0 が来るものは， 
普通使われる数の表し方ではないので禁止されている．
Ｊ中学校の生徒であるあなたは， 
自分のクラスが勝つためにはどのように並ぶのがよいかを 
考えなければならない．
入力ファイルの１行目に正整数 n と
１桁の整数 c（先生が持つ旗の番号）が
１つの半角空白文字で区切られて書かれている． 
c<0 のときは，
先生が中央に立たないことを表わす．
与えられる入力は 1≦n≦10 である．
負けない並び方の順番
b
1
b
2
… b
n
c g
n
… g
2
g
1
または　 
b
1
b
2
… b
n
g
n
… g
2
g
1
を出力せよ．
出力ファイルにおいては，
出力の最後にも改行コードを入れること．
入出力例
入力例１
1 0
出力例１
101
入力例２
1 5
出力例２
757
入力例３
3 7
出力例３
9957599
入力例４
1 -1
出力例４
11
問題文と自動審判に使われるデータは、
情報オリンピック日本委員会
が作成し公開している問題文と採点用テストデータです。

Submitted solutions:

code_snippet: #pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}
inline double time() {
    return static_cast<long double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int a,b; cin >> a >> b;
    if (b < 0) {
      if (a == 1) {
        cout << 11 << endl;
      }
      else {
        for (int i = 0; i < 2*a; i++) {
          cout << 9;
        }
        cout << endl;
      }
    }
    else {
      vector<ll> ten;
      {
        ll cur = 1;
        for (int i = 0; i <= 18; i++) {
          ten.push_back(cur);
          cur *= 10;
        }
      }
      ll res = -1;
      ll cur = ten[a]*b;
      auto dfs = [&](auto dfs, int i) -> void {
        if (i == a) {
          if (res > cur) return;
          for (ll p = 2; p*p <= cur; p++) {
            if (cur%p == 0) return;
          }
          res = max(res, cur);  
          return;        
        }
        else {
          for (int j = 0; j <= 9; j++) {
            if (i == 0 and j%2 == 0) continue;
            cur += ten[i] * j;
            cur += ten[2*a-i] * j;
            dfs(dfs, i+1);
            cur -= ten[i] * j;
            cur -= ten[2*a-i] * j;
          }
        }
      };
      dfs(dfs,0);
      if (res == -1) {
        for (int i = 0; i < a; i++) {
          cout << 9;
        }
        cout << b;
        for (int i = 0; i < a; i++) {
          cout << 9;
        }
        cout << endl;
      }
      else {
        cout << res << endl;
      }
    }
}
accuracy: 1
time_ms: 80
memory_kb: 3384
final_rank: 17

code_snippet: #include<iostream>
#include<cmath>
using namespace std;

typedef long long ll;

ll ret = -1;
ll x;
int n, c;

bool isPrime(ll tmp){
    for(ll i = 2; i*i <= tmp; i++){
        if(tmp%i == 0)    return false;
    }
    return tmp!=1;
}

ll apow(int s){
    ll ret = 1;
    while(s-- > 0)  ret *= 10;
    return ret;
}

void dfs(int p){
    if(isPrime(x))  ret = max(ret, x);
    if(p == 0)  return;

    for(int i = 0; i <= 9; i++){
        if(p == 1 && i == 0)    continue;
        x *= 10;
        x += i;
        x += apow(2*(n-p+1)) * i;
        dfs(p-1);
        x -= apow(2*(n-p+1)) * i;
        x /= 10;
    }
}

int main(){
    cin >> n >> c;

    if(c < 0){
        if(n == 1)  cout << 11 << endl;
        else{
            for(int i = 0; i < 2*n; i++)    cout << "9";
            cout << endl;
        }
    }else{
        x = c;
        dfs(n);
        cout << ret << endl;
    }

    return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3088
final_rank: 13

code_snippet: // test 

#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;
int n, m;
long long int ans;

char x[16];

bool prime(long long int x)
{
	for (long long int i = 2; i * i <= x; i++){
		if (x % i == 0) return (false);
	}
	return (x != 1);
}

void dfs(int idx)
{
	if (idx == n){
		if (prime(atoll(x))) ans = max(ans, atoll(x));
		return;
	}
	for (int i = '0'; i <= '9'; i++){
		if (idx == 0 && (i != '1' && i != '3' && i != '7' && i != '9')) continue;
		x[idx] = i; x[2 * n - idx] = i;
		dfs(idx + 1);
	}
}

int main()
{	
	scanf("%d %d", &n, &m);
	if (m < 0){
		if (n != 1) for (int i = 0; i < 2 * n; i++) printf("9");
		else printf("11");
		printf("\n");
	}
	else {
		x[2 * n + 1] = 0;
		x[n] = m + '0';
		dfs(0);
		printf("%lld\n", ans);
	}
	return (0);
}
accuracy: 1
time_ms: 100
memory_kb: 2696
final_rank: 12

code_snippet: #include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


ll N,C;

bool is_ok(ll num){

	stack<ll> S;

	while(num > 0){
		S.push(num%10);
		num /= 10;
	}

	int index = 0;
	ll array[22];

	while(!S.empty()){
		array[index++] = S.top();
		S.pop();
	}

	if(array[N] != C){
		return false;
	}

	for(int i = 0; i < index/2; i++){
		if(array[i] != array[index-1-i]){
			return false;
		}
	}
	return true;
}


int main(){

	scanf("%lld %lld",&N,&C);

	if(C < 0){
		if(N == 1){
			printf("11\n");
		}else{
			for(ll i = 0; i < 2*N; i++){
				printf("9");
			}
			printf("\n");
		}
		return 0;
	}

	ll num = 0;
	for(ll i = 0; i < N; i++){
		num = 10*num+9;
	}
	num = 10*num+C;
	for(ll i = 0; i < N; i++){
		num = 10*num+9;
	}

	bool FLG;

	while(true){
		if(is_ok(num)){
			if(num%2 != 0){
				FLG = true;
				for(int i = 3; i*i <= num; i += 2){
					if(num%i == 0){
						FLG = false;
						break;
					}
				}
				if(FLG){
					printf("%lld\n",num);
					return 0;
				}
			}
		}
		num--;
	}
	return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 3184
final_rank: 14

code_snippet: #include<bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;

int a, b, t = 0, u = 0;
int Max = 0;
bool is_prime(int n) {
	for (int i = 2; i*i <= n; i++) {
		if (n%i == 0)return false;
	}
	return true;
}
void dfs(int p) {
	if (a == p) {
		int c = t*pow(10, a + 1) + b*pow(10, a) + u;
		if (is_prime(c))Max = max(Max, c);
		return;
	}
	rep(i, 10) {
		if (i == 0 && p == 0)continue;
		t = t * 10 + i;
		u += i*pow(10, p);
		dfs(p + 1);
		t /= 10; u -= i*pow(10, p);
	}
}
int main() {
	scanf("%d%d", &a, &b);
	if (b < 0) {
		if (a == 1)puts("11");
		else {
			rep(i, 2*a)printf("9");
			printf("\n");
		}
		return 0;
	}
	dfs(0);
	printf("%d\n", Max);
}
accuracy: 1
time_ms: 30
memory_kb: 3348
final_rank: 16

code_snippet: #include<bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;

int a, b;
string t, u;
int Max = 0;
bool is_prime(int n) {
	for (int i = 2; i*i <= n; i++) {
		if (n%i == 0)return false;
	}
	return true;
}
void dfs(int p) {
	if (a == p) {
		string q = t; reverse(q.begin(), q.end());
		int c = stoi(t + u + q);
		if (is_prime(c))Max = max(Max, c);
		return;
	}
	rep(i, 10) {
		if (i == 0 && p == 0)continue;
		t += to_string(i);
		dfs(p + 1);
		t.pop_back();
	}
}
int main() {
	scanf("%d%d", &a, &b);
	if (b < 0) {
		if (a == 1)puts("11");
		else {
			rep(i, 2*a)printf("9");
			printf("\n");
		}
		return 0;
	}
	u = to_string(b);
	dfs(0);
	printf("%d\n", Max);
}
accuracy: 1
time_ms: 30
memory_kb: 3308
final_rank: 15

code_snippet: #include<bits/stdc++.h>
using namespace std;

int N,C;


int a[10000];
long long ans;

void check(){
    a[N]=C;
    for(int i=0;i<N;i++)a[2*N-i]=a[i];

    long long val=0;
    for(int i=0;i<2*N+1;i++){
        val=val*10+a[i];
    }

    for(long long i=2;i*i<=val;i++){
        if(val%i==0)return;
    }

    ans=max(ans,val);
}

void dfs(int pos){
    if(pos==N){
        check();
        return;
    }

    for(int i=0;i<10;i++){
        if(pos==0&&i==0)continue;
        a[pos]=i;
        dfs(pos+1);
    }

}
int main(){
    cin>>N>>C;

    if(C<0&&N>1){
        for(int i=0;i<2*N;i++)cout<<9;
        cout<<endl;
    }
    else if(C<0){
        cout<<11<<endl;
    }
    else{
        dfs(0);
        cout<<ans<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 110
memory_kb: 1168
final_rank: 6

code_snippet: #include <bits/stdc++.h>
#define PB push_back
#define MP make_pair
#define REP(i,n) for (int i=0;i<(n);i++)
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define ALL(a) (a).begin(),(a).end()
#define MOD 10000
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const ull B=100000007;
const int INF=1e9;
string rs;
ll N,C,ans;
bool is_prime(ll n){
      for(int i=2;i*i<=n;i++){
            if(n%i==0)return false;
      }
      return n!=1;
}
ll to_i(string s){
      ll k=1,res=0;
      reverse(ALL(s));
      REP(i,s.size()){
            res+=(s[i]-'0')*k;
            k*=10;
      }
      return res;
}
void rec(string s){
      if(s.size()==N){
            if((s[0]-'0')%2==0)return;
            rs=s;reverse(ALL(rs));
            if(C>=0)s+=(char)(C+'0');
            s+=rs;
            ll t=to_i(s);
            if(is_prime(t))ans=max(ans,t);
            return;
      }
      REP(i,10)rec(s+(char)(i+'0'));
      return;
}
int main(){
      cin>>N>>C;
      ans=-1;
      if(C<0){
            REP(i,N*2)cout<<9;cout<<endl;
      }else{
            rec("");
            cout<<ans<<endl;
      }
}
accuracy: 1
time_ms: 110
memory_kb: 1208
final_rank: 8

code_snippet: #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>


using namespace std;
typedef long long ll;

#define mod 1000000007
#define INF 2000000000
#define LLINF 4000000000000000000
#define SIZE 50010

int num[4];
int n,c,ans=0;

int dfs(int h){
    int k=0;
    bool f = true;
    
    if(h==n){
        
        for(int i=0;i<n;i++){
            k+=(int)(pow(10,i)+pow(10,2*n-i))*num[i];
        }
        
        k+=(int)pow(10,n)*c;
        
        for(int i=2;i*i<=k;i++){
            if (k%i==0) {
                f =false;
                break;
            }
        }
        
        if(f)
            return k;
        else
            return 0;
    }
    
    for(int i=0;i<=9;i++){
        num[h] = i;
        k=max(k,dfs(h+1));
    }
    
    return k;
}

int main(){
    
    scanf("%d%d",&n,&c);
    
    if(c <  0){
        if(n==1){
            puts("11");
            return 0;
        }
        
        for(int i=0;i<2*n;i++)
            printf("9");
        printf("\n");
        return 0;
    }
    
    ans = dfs(0);
    
    if(ans==0){
        for(int i=0;i<2*n+1;i++){
            if(i==n)
                printf("%d",c);
            else
                printf("9");
        }
        printf("?\n");
        return 0;
    }
    
    printf("%d\n",ans);
    
    return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 1232
final_rank: 3

code_snippet: #include<cstdio>
#include<iostream>
#include<string>

using namespace std;
typedef long long ll;
int n,c;

bool check(ll q){
	int cd[11];
	for(int i=0;i<n*2+1;i++){
		cd[i]=q%10;
		q/=10;
	}
	if(cd[n]!=c)return false;
	for(int i=0;i<n;i++){
		if(cd[i]!=cd[n*2-i])return false;
	}
	return true;
}

int main(void){
	scanf("%d%d",&n,&c);
	if(c<0){
		if(n==1)printf("11\n");
		else{
			string s;
			for(int i=0;i<n*2;i++)s+='9';
			cout << s << endl;
		}
		return 0;
	}
	
	ll q=0;
	for(int i=0;i<n*2+1;i++)q=q*10+9;
	while(1){
		if(check(q)){
			bool f=true;
			for(ll i=2;i*i<=q;i++){
				if(q%i==0)f=false;
				if(!f)break;
			}
			if(f){
				printf("%lld\n",q);
				return 0;
			}
		}
		q--;
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1208
final_rank: 2

code_snippet: #include<cstdio>
#include<iostream>
#include<string>

using namespace std;
typedef long long ll;
int n,c;

bool check(ll q){
	int cd[11];
	for(int i=0;i<n*2+1;i++){
		cd[i]=q%10;
		q/=10;
	}
	if(cd[n]!=c)return false;
	for(int i=0;i<n;i++){
		if(cd[i]!=cd[n*2-i])return false;
	}
	return true;
}

int main(void){
	scanf("%d%d",&n,&c);
	ll q=0;
	if(c<0){
		if(n==1)printf("11\n");
		else{
			for(int i=0;i<n*2;i++)q=q*10+9;
			printf("%lld\n",q);
		}
		return 0;
	}
	for(int i=0;i<n*2+1;i++)q=q*10+9;
	while(1){
		if(check(q)){
			bool f=true;
			for(ll i=2;i*i<=q;i++){
				if(q%i==0)f=false;
				if(!f)break;
			}
			if(f){
				printf("%lld\n",q);
				return 0;
			}
		}
		q--;
	}
	return 0;
}
accuracy: 0.8
time_ms: 10
memory_kb: 1192
final_rank: 18

code_snippet: /*
    inputファイル見ないと通るか分からない奴やめろ
 */

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

int n;
int c;

int pow(int base, int exp) {
    int res;
    if (exp == 0) return 1;

    res = pow(base*base, exp/2);
    if (exp % 2 == 1) res *= base;
    return res;
}

bool isprime(int p) {
    for (int i=2; i<=(int)floor(sqrt(p)); i++) {
        if (p % i == 0) return false;
    }

    return true;
}

int dfs(int now, int count) {
    int ans = -1;

    if (count == 0) {
        if (now % 10 == 0 || !isprime(now)) return -1;
        return now;
    }

    for (int i=0; i<10; i++) {
        ans = max(ans, dfs(now * 10 + i * pow(10, (n-count+1)*2) + i, count-1));
    }

    return ans;
}


int main() {
    scanf("%d %d", &n, &c);

    if (c < 0) {
        if (n == 1) {
            puts("11");
        } else {
            for (int i=0; i<n*2; i++) printf("9");
            puts("");
        }
    } else {
        int ans = dfs(c, n);
        if (ans == -1) {
            for (int i=0; i<n; i++) printf("9");
            printf("%d", c);
            for (int i=0; i<n; i++) printf("9");
            puts("");
        } else {
            printf("%d\n", ans);
        }
    }
}
accuracy: 1
time_ms: 50
memory_kb: 1024
final_rank: 1

code_snippet: #include<bits/stdc++.h>
using namespace std;

inline string toString(int a){
  stringstream ss;
  ss << a;
  return ss.str();
}

inline int toInt(string s){
  stringstream ss(s);
  int res;
  ss >> res;
  return res;
}

inline bool is_prime(int a){
  if(a<=1)return false;
  for(int i=2;i*i<=a;i++){
    if(a%i==0)return false;
  }
  return true;
}

int rec(int d, int n, string s, string c){
  if(n>4)return -1;
  if(d==n){
    string pal = s + c;
    reverse(s.begin(),s.end());
    pal += s;
    int p = toInt(pal);
    return is_prime(p)?p:-1;
  }

  int res = -1;
  for(int i=0;i<10;i++){
    if(d==0 && (i%2==0 || i%5==0))continue;
    res = max( res, rec(d+1, n, s + toString(i), c) );
  }
  return res;
}

int main(){
  int n,c;
  cin >> n >> c;
  string center = (c<0)?"":toString(c);
  int res = rec(0,n,"",center);

  if(res<0){
    for(int i=0;i<n;i++)cout << "9";
    cout << center;
    for(int i=0;i<n;i++)cout << "9";
    cout << endl;
  }else{
    cout << res << endl;
  }
}
accuracy: 1
time_ms: 60
memory_kb: 1232
final_rank: 3

code_snippet: #include<bits/stdc++.h>
using namespace std;

string toString(int a){
  stringstream ss;
  ss << a;
  return ss.str();
}

int toInt(string s){
  stringstream ss(s);
  int res;
  ss >> res;
  return res;
}

bool is_prime(int a){
  if(a<=1)return false;
  for(int i=2;i*i<=a;i++){
    if(a%i==0)return false;
  }
  return true;
}

int rec(int d, int n, string s, string c){
  if(n>4)return -1;
  if(d==n){
    string pal = s + c;
    reverse(s.begin(),s.end());
    pal += s;
    int p = toInt(pal);
    return is_prime(p)?p:-1;
  }

  int res = -1;
  for(int i=0;i<10;i++){
    if(d==0 && (i%2==0 || i%5==0))continue;
    res = max( res, rec(d+1, n, s + toString(i), c) );
  }
  return res;
}

int main(){
  int n,c;
  cin >> n >> c;
  string center = (c<0)?"":toString(c);
  int res = rec(0,n,"",center);

  if(res<0){
    for(int i=0;i<n;i++)cout << "9";
    cout << center;
    for(int i=0;i<n;i++)cout << "9";
    cout << endl;
  }else{
    cout << res << endl;
  }
}
accuracy: 1
time_ms: 60
memory_kb: 1232
final_rank: 3

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
  
using namespace std;
  
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;
  
static const double EPS = 1e-8;
  
static const int tx[] = {0,1,0,-1};
static const int ty[] = {-1,0,1,0};

ll fast_pow(ll x, ll n) {
  ll res = 1;
  while(n > 0) {
    if (n & 1) res = res * x;
    x = x * x;
    n >>= 1;
  }
  return res;
}

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

enum Type{
  EVEN,
  ODD,
};

Type type;

ll dfs(ll pos,ll sum,ll len,ll center){
  if(pos == len/2){
    sum += (type == EVEN ? 0 : center * fast_pow(10,len/2));
    if(is_prime(sum)){
      return sum;
    }
    return 0;
  }
  ll res = 0;
  
  for(ll i=0;i<=9;i++){
    if(pos == 0 && i == 0) continue;
    ll lhs = i * fast_pow(10,pos);
    ll rhs = i * fast_pow(10,len-pos-1);
    res = max(dfs(pos + 1,sum + lhs + rhs,len,center),res);
  }
  return res;
}

int main(){
  ll n,center;
  while(~scanf("%lld %lld",&n,&center)){
    //odd
    if(center < 0){
      type = EVEN;

      if(n == 1){
        cout << "11" << endl;
      }
      else{
        cout << string(2*n,'9') << endl;
      }
    }
    //even
    else{
      type = ODD;
      ll len = 2 * n + (type == ODD ? 1 : 0);      
      ll ans = 0;
      ll none_ans = 0;
      
      for(int i=0;i<len;i++){
        none_ans += 9 * fast_pow(10,i);
      }
      printf("%lld\n",(ans = dfs(0,0,len,center)) == 0 ? none_ans : ans);
    }
  }
}
accuracy: 1
time_ms: 110
memory_kb: 1216
final_rank: 9

code_snippet: #include<iostream>
#include<sstream>
#include<vector>

using namespace std;

long long pow10(int n){
	long long res=1;
	while(n--)
		res*=10;
	return res;
}

bool isPrime(long long n){
	for(long long i=2;i*i<=n;i++)
		if(n%i==0)return false;
	return true;
}

int main(){
	ostringstream out;

	int n,m;
	cin >> n >> m;
	vector<int> boy;
	for(int i=0;i<n;i++)
		boy.push_back(9);

/*
	vector<bool> prime(pow10(m>=0?2*n+1:2*n));
	for(int i=2;i<prime.size();i++){
		if(prime[i])continue;
		for(int j=i*2;j<prime.size();j+=i)
			prime[j]=true;
	}
*/
/*
	for(int i=0;i<prime.size();i++)
		cout << i << " "<<prime[i] << endl;

	if(true)
		return 0;
*/

	while(true){
		vector<int>num;
		for(int i=0;i<n;i++)
			num.push_back(boy[i]);
		if(m>=0)
			num.push_back(m);
		for(int i=n-1;i>=0;i--)
			num.push_back(boy[i]);
		unsigned long long number=0;
		for(int i=0;i<num.size();i++)
			number+=num[i]*pow10(num.size()-1-i);
//		if(!prime[number]){
		if(isPrime(number)){
			out << number << endl;
			break;
		}

		int i=boy.size()-1;
		for(;i>=0;i--){
			if(boy[i]<0){
				boy[i]=9;
				if(i>0)
					boy[i-1]--;
				continue;
			}else{
				boy[i]--;
				break;
			}
		}

		if(i<0||boy[i]==0){
			for(int i=0;i<n;i++)
				out << 9;
			if(m>=0)
				out << m;
			for(int i=0;i<n;i++)
				out << 9;
			out << endl;
			break;
		}

	}

	cout << out.str();
	return 0;
}
accuracy: 1
time_ms: 80
memory_kb: 1244
final_rank: 7

code_snippet: #include<iostream>
#include<sstream>
#include<vector>

using namespace std;

int pow10(int n){
	int res=1;
	while(n--)
		res*=10;
	return res;
}

bool isPrime(int n){
	for(int i=2;i<n/2;i++)
		if(n%i==0)return false;
	return true;
}

int main(){
	ostringstream out;

	int n,m;
	cin >> n >> m;
	vector<int> boy;
	for(int i=0;i<n;i++)
		boy.push_back(9);

/*
	vector<bool> prime(pow10(m>=0?2*n+1:2*n));
	for(int i=2;i<prime.size();i++){
		if(prime[i])continue;
		for(int j=i*2;j<prime.size();j+=i)
			prime[j]=true;
	}
*/
/*
	for(int i=0;i<prime.size();i++)
		cout << i << " "<<prime[i] << endl;

	if(true)
		return 0;
*/

	while(true){
		vector<int>num;
		for(int i=0;i<n;i++)
			num.push_back(boy[i]);
		if(m>=0)
			num.push_back(m);
		for(int i=n-1;i>=0;i--)
			num.push_back(boy[i]);
		int number=0;
		for(int i=0;i<num.size();i++)
			number+=num[i]*pow10(num.size()-1-i);
//		if(!prime[number]){
		if(isPrime(number)){
			out << number << endl;
			break;
		}

		int i=boy.size()-1;
		for(;i>=0;i--){
			if(boy[i]<0){
				boy[i]=9;
				if(i>0)
					boy[i-1]--;
				continue;
			}else{
				boy[i]--;
				break;
			}
		}

		if(i<0||boy[i]==0){
			for(int i=0;i<n;i++)
				out << 9;
			if(m>=0)
				out << m;
			for(int i=0;i<n;i++)
				out << 9;
			out << endl;
			break;
		}

	}

	cout << out.str();
	return 0;
}
accuracy: 0.8
time_ms: 1840
memory_kb: 1244
final_rank: 20

code_snippet: #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define EQ(a,b) (abs((a)-(b))<EPS)
int n,c,t=0;
string itos(ll a)
{
	string s;
	while(a>0)
	{
		int e=a%10ll;
		s+=e+'0';
		a/=10ll;
	}
	reverse(s.begin(),s.end());
	return s;
}
bool is_palindrome(ll p)
{
	string s=itos(p);
	if(s[n]!=(c+'0'))return false;
	for(int i=0;i<((int)s.size())/2;i++)
	{
		if(s[i]!=s[s.size()-1-i])return false;
	}
	return true;
}
bool is_prime(ll x)
{
	for(ll i=2;i*i<=x;i++)
	{
		if(x%i==0)return false;
	}
	return true;
}
int main()
{
	cin >> n >> c;
	if(c>=0)t=1;
	if(n==1&&c<0)
	{
		cout << 11 << endl;
		return 0;
	}
	if(c<0)
	{
		for(int i=0;i<2*n;i++)cout << 9;
		cout << endl;
		return 0;
	}
	int mx=((int)pow(10,2*n+t))-1,mi=((int)pow(10,2*n+t-1));
	for(int i=mx;i>=mi;i--)
	{
		if(!is_palindrome(i))continue;
		if(!is_prime(i))continue;
		cout << i << endl;
		return 0;
	}
	cout << ((int)pow(10,2*n+t))-1 << endl;
	return 0;
}
accuracy: 1
time_ms: 130
memory_kb: 1248
final_rank: 10

code_snippet: #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define EQ(a,b) (abs((a)-(b))<EPS)
int n,c,t=0;
string itos(ll a)
{
	string s;
	while(a>0)
	{
		int e=a%10ll;
		s+=e+'0';
		a/=10ll;
	}
	reverse(s.begin(),s.end());
	return s;
}
/*int rev(int k)
{
	int res=0;
	while(k>0)
	{
		res+=k%10;
		k/=10;
		res*=10;
	}
	return res/10;
}*/
bool is_palindrome(ll p)
{
	string s=itos(p);
	if(s[n]!=(c+'0'))return false;
	for(int i=0;i<((int)s.size())/2;i++)
	{
		if(s[i]!=s[s.size()-1-i])return false;
	}
	return true;
}
bool is_prime(ll x)
{
	for(ll i=2;i*i<=x;i++)
	{
		if(x%i==0)return false;
	}
	return true;
}
int main()
{
	cin >> n >> c;
	if(c>=0)t=1;
	if(n==1&&c<0)
	{
		cout << 11 << endl;
		return 0;
	}
	if(c<0)
	{
		for(int i=0;i<2*n;i++)cout << 9;
		cout << endl;
		return 0;
	}
	int mx=((int)pow(10,2*n+t))-1,mi=((int)pow(10,2*n+t-1));
	for(int i=mx;i>=mi;i--)
	{
		//int v=i*100*mi+c*10*mi+rev(i);
		if(!is_palindrome(i))continue;
		if(!is_prime(i))continue;
		cout << i << endl;
		return 0;
	}
	/*cout << ((int)pow(10,n))-1;
	cout << c;
	cout << ((int)pow(10,n))-1;*/
	cout << ((int)pow(10,2*n+t))-1 << endl;
	return 0;
}
accuracy: 1
time_ms: 150
memory_kb: 1248
final_rank: 11

code_snippet: #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define EQ(a,b) (abs((a)-(b))<EPS)
int n,c,t=0;
string itos(int a)
{
	string s;
	while(a>0)
	{
		int e=a%10;
		s+=e+'0';
		a/=10;
	}
	reverse(s.begin(),s.end());
	return s;
}
bool is_palindrome(int p)
{
	string s=itos(p);
	if(s[n]!=(c+'0'))return false;
	for(int i=0;i<((int)s.size())/2;i++)
	{
		if(s[i]!=s[s.size()-1-i])return false;
	}
	return true;
}
bool is_prime(int x)
{
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)return false;
	}
	return true;
}
int main()
{
	cin >> n >> c;
	if(c>=0)t=1;
	if(n==1&&c<0)
	{
		cout << 11 << endl;
		return 0;
	}
	if(c<0)
	{
		cout << ((int)pow(10,2*n+t))-1 << endl;
		return 0;
	}
	int mx=((int)pow(10,2*n+t))-1,mi=(int)(pow(10,2*n+t-1));
	for(int i=mx;i>=mi;i--)
	{
		if(!is_palindrome(i))continue;
		if(!is_prime(i))continue;
		cout << i << endl;
		return 0;
	}
	cout << ((int)pow(10,2*n+t))-1 << endl;
	return 0;
}
accuracy: 0.8
time_ms: 140
memory_kb: 1244
final_rank: 19