Problem:
問題５

　Ｊ中学校の運動会で次のようなクラス対抗の競技を行なうことになった．
各クラスから生徒代表の男女 n ペア

     　　 (男子生徒 b1， 女子生徒 g1)， (男子生徒 b2， 女子生徒 g2)， … ， (男子生徒 bn， 女子生徒 gn)

を選び，
0 から 9 までの数字が書かれた旗を自由に選んでもらい
（それぞれの旗は十分な個数ある），
横一列に並んでもらう．
ただし，
ペアになっている男子生徒と女子生徒は同じ番号の旗を一人１つずつ
選ばなければならず，
並び順は

     　　 b1 b2 … bn c gn … g2 g1

のように，
男子生徒達 n 人の並び順
b1 b2 … bn とは逆の順番
gn … g2 g1 で女子生徒達は
並ばなければならない．
中央の c には，
クラス担任の先生があらかじめ審判長によって指定された
番号の付いた旗を持って立つ場合と，
立たないことを審判長に指定される場合とがある．

　こうして並んだ生徒達（と先生）が持った旗の番号
を 2n 桁（または 2n+1 桁）の整数と考えたとき，
それが素数である方が勝ちである．
ただし，
両クラスとも素数だった場合あるいは両クラスとも素数でなかった場合には，
数が大きい方が勝ちである． また，

　　

      0 b2 … bn c gn … g2 0
　あるいは　
0 b2 … bn gn … g2 0

のように先頭に 0 が来るものは，
普通使われる数の表し方ではないので禁止されている．

　Ｊ中学校の生徒であるあなたは，
自分のクラスが勝つためにはどのように並ぶのがよいかを
考えなければならない．

　入力ファイルの１行目に正整数 n と
１桁の整数 c（先生が持つ旗の番号）が
１つの半角空白文字で区切られて書かれている．
c<0 のときは，
先生が中央に立たないことを表わす．

与えられる入力は 1≦n≦10 である．

　負けない並び方の順番

　　

     b1 b2 … bn c gn … g2 g1
　または　
b1 b2 … bn gn … g2 g1

を出力せよ．

出力ファイルにおいては，
出力の最後にも改行コードを入れること．

入出力例

入力例１

1 0

出力例１

101

入力例２

1 5

出力例２

757

入力例３

3 7

出力例３

9957599

入力例４

1 -1

出力例４

11

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C++ (judge verdict: Memory Limit Exceeded)

#include<iostream>
#include<sstream>
#include<vector>

using namespace std;

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

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<char> 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]){
			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;
}