Problem:
Score : 300 points

Problem Statement

Iroha is very particular about numbers. There are K digits that she dislikes: D_1, D_2, ..., D_K.

She is shopping, and now paying at the cashier.
Her total is N yen (the currency of Japan), thus she has to hand at least N yen to the cashier (and possibly receive the change).

However, as mentioned before, she is very particular about numbers. When she hands money to the cashier, the decimal notation of the amount must not contain any digits that she dislikes. Under this condition, she will hand the minimum amount of money.

Find the amount of money that she will hand to the cashier.

Constraints

1 ≦ N < 10000

1 ≦ K < 10

0 ≦ D_1 < D_2 < … < D_K≦9

\{D_1,D_2,...,D_K\} ≠ \{1,2,3,4,5,6,7,8,9\}

Input

The input is given from Standard Input in the following format:

N K
D_1 D_2 … D_K

Output

Print the amount of money that Iroha will hand to the cashier.

Sample Input 1

1000 8
1 3 4 5 6 7 8 9

Sample Output 1

2000

She dislikes all digits except 0 and 2.

The smallest integer equal to or greater than N=1000 whose decimal notation contains only 0 and 2, is 2000.

Sample Input 2

9999 1
0

Sample Output 2

9999

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

//拘り者いろはちゃん//
//再帰関数版
//
using System;
using System.Collections.Generic;

namespace tst
{
    class Define
    {
        public static int INFTY = 100000;
    }
    class Program
    {
        public static int N;//支払金額N円
        public static int K;//嫌いな数字K個
        public static int min = Define.INFTY;
        public static int[] X = new int[4];
        public static void Keisan(int[] Ok, int k4, int k3, int k2, int k1, int cnt)
        {
            //ばらばらの数字で送られてきたものを合体
            int x = k4 * 1000 + k3 * 100 + k2 * 10 + k1;
            if (N <= x && x < min)
            {//買えて最小値を更新できるなら
                if (Ok[0] !=0 && Keta(x))//0が使えない時に残骸が残っていたら
                {//Keisan(Ok, 0, 0, 0, z, cnt);での0の残骸は消したい
                    //最小値更新しない
                }
                else min = x;
            }
            if (cnt == 3)
            {//終了条件
                return;
            }
            for (int i = 0; i < Ok.Length; i++)
            {
                Keisan(Ok, k4, k3, k2, k1, cnt + 1);
                Keisan(Ok, Ok[i],k3,  k2, k1, cnt + 1);
                Keisan(Ok, k4, Ok[i], k2, k1, cnt + 1);
                Keisan(Ok, k4, k3, Ok[i], k1, cnt + 1);
            }
        }
        public static bool Keta(int n)
        {
            //桁出しして!=0より右に0があるとアウト8210や3030も
            bool flag=false;
            int top = 5;
            for(int i=3; i>=0; i--)
            {
                X[i] = n % 10;
                n /= 10;
                if (X[i] != 0)
                {
                    top = i;
                }
            }
            for(int i = 3; i > top; i--)
            {
                if (X[i] == 0) flag = true;
            }
            //残骸があるときtrue
            return flag;
        }

        public static void Main()
        {   //支払金額N円、嫌いな数字K個
            string[] text1 = Console.ReadLine().Split(' ');
            N = int.Parse(text1[0]);
            K = int.Parse(text1[1]);
            //嫌いな数字0～9
            string[] D = Console.ReadLine().Split(' ');
            //逆に使える数の配列
            List<string> All = new List<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            for (int i = 0; i < K; i++)
            {
                All.Remove(D[i]);
            }
            int[] Ok = new int[10 - K];
            for (int i = 0; i < Ok.Length; i++)
            {
                Ok[i] = int.Parse(All[i]);
            }
            int cnt = 0;
            foreach (int z in Ok)
            {
                //３ケタ２ケタ１ケタの場合も考えるので先頭が0でも構わない
                //１桁目からスタートしないと出力できない数がある
                Keisan(Ok, 0, 0, 0, z, cnt);
            }
            if (min == Define.INFTY)
            {//4桁未満で答えがなかった時
                if (Ok[0] == 0)
                {
                    //一桁目が0だと５ケタにならないなので
                    Console.WriteLine(Ok[1] * 10000);
                }
                else if (1 <= Ok[0] && Ok[0] <= 9)
                {
                    Console.WriteLine(Ok[0] * 10000 + Ok[0] * 1000 + Ok[0] * 100 + Ok[0] * 10 + Ok[0]);
                }
            }
            else if (min < Define.INFTY)
            {//答えがあった時
                Console.WriteLine(min);
            }
        }

    }
}