Problem:
Score: 300 points

Problem Statement

Find the minimum prime number greater than or equal to X.

Notes

A prime number is an integer greater than 1 that cannot be evenly divided by any positive integer except 1 and itself.

For example, 2, 3, and 5 are prime numbers, while 4 and 6 are not.

Constraints

2 \le X \le 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

X

Output

Print the minimum prime number greater than or equal to X.

Sample Input 1

20

Sample Output 1

23

The minimum prime number greater than or equal to 20 is 23.

Sample Input 2

2

Sample Output 2

2

X itself can be a prime number.

Sample Input 3

99992

Sample Output 3

100003

Solution in Kotlin (1.0.0) (judge verdict: Accepted)

import java.util.*

fun main(args: Array<String>) {
    abc149c()
}

fun abc149c() {
    val x = readLine()!!.toLong()

    for (i in x..Long.MAX_VALUE) {
        if (isPrime(i)) return println(i)
    }
}

private fun modPow(n: Long, p: Long, m: Long): Long {
    var x = n
    var y = p
    var result = 1L

    x %= m
    while (y > 0) {
        if (y % 2 == 1L)
            result = (result * x) % m
        y = y shr 1
        x = (x * x) % m
    }

    return result
}

private fun millerTest(n: Long, d: Long): Boolean {
    val a = 2 + (Math.abs(Random().nextLong()) % (n - 2))
    var x = modPow(a, d, n)
    var d1 = d

    if (x == 1L || x == n - 1) return true

    while (d1 != n - 1) {
        x = (x * x) % n
        d1 *= 2
        if (x == 1L) return false
        if (x == n - 1) return true
    }
    return false
}

private fun isPrime(n: Long): Boolean {
    if (n <= 1L || n == 4L) return false
    if (n <= 3L) return true

    var d = n - 1
    while (d % 2 == 0L) d /= 2

    for (i in 0 until 1000) {
        if (!millerTest(n, d)) return false
    }
    return true
}