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 Kotlin (1.0.0) (judge verdict: Wrong Answer)

fun main(args: Array<String>) {
    val (n, k) = readLine()!!.split(" ").map { it.toInt() }
    val inputs = readLine()!!.split(" ").map { it.toInt() }

    //金額の10進法表記に inputs に含まれる数字が出現しない中で最小数を求める

    //作れないケースは無い
    var digits = n.toString()

    // WA: 0..10 としてしまっていた
    val available = (0..9).toSet().subtract(inputs).toList().sorted()

    // 最小の桁から決定していく & 必要であれば繰り上げ ( 基準値を+1する）
    var up = 0

    // 文字列から数字にする場合は toInt()では☓ Integer.parseInt()を使う必要がある
    var rev = digits.reversed().toList().map { Integer.parseInt(it.toString()) }
    val ans = mutableListOf<Int>()

    for (i in 0 until rev.size) {

        //　前の繰り上げを考慮
        val min = rev[i] + up
        up = 0

        // 繰り上げが存在するかどうか判定
        for (j in 0 until available.size) {
            if (available[j] >= min) {
                ans.add(available[j])
                break
            }

            if (j == available.size - 1) {
                ans.add(available[0])
                up = 1
            }
        }
    }

    // 最後の繰り上げがあった場合, 一番上の桁に 0 以外を追加する
    if (up == 1) {
        if(available[0] != 0) ans.add(available[0]) else ans.add(available[1])
    }

    val p = ans.reversed().joinToString("")

    println(p)
}