Problem:
Score : 300 points

Problem Statement

You are given an integer N.
Find the number of the positive divisors of N!, modulo 10^9+7.

Constraints

1≤N≤10^3

Input

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

N

Output

Print the number of the positive divisors of N!, modulo 10^9+7.

Sample Input 1

3

Sample Output 1

4

There are four divisors of 3! =6: 1, 2, 3 and 6. Thus, the output should be 4.

Sample Input 2

6

Sample Output 2

30

Sample Input 3

1000

Sample Output 3

972926972

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

fun main(args: Array<String>) {
    val n = readLine()!!.toInt()

    // n の階乗の約数の個数を mod 1e9+7 で出力
    // n を構成する素数と，その数を求める

    val counter = IntArray(1001)

    // そもそも 1000 の階乗は計算結果を保持しておけないので注意
    // どうする？？
    // 愚直に全探索でも間に合う

    // 実装が汚い，きれいな方針は？
    for (i in 1 until counter.size) {
        // 素数の場合だけカウント -> 素数判定が間違っている？？
        if(isPrime(i)) {
            // n の階乗で出てくる値一つ一つで当該の素数が何回出てくるか確認
            for (j in 1..n) {
                var k = j
                while (k % i == 0 && k != 0) {
                    counter[i] += 1
                    k /= i
                }
            }
        }
    }

//    val ans = counter.filter { it != 0 }.map { it + 1 }.fold(1) { acc, i -> acc * i % (1e9+7).toInt()}

    var tmp = 1L
    for (v in counter) {
        if ( v != 0 ){
            tmp = tmp * (v+1) % (1e9+7).toLong()
        }
    }
    // WA: 値が大きくなるとWA なぜ？ -> 素数判定が間違っていた & Long を使っていなかったのオーバーフローした
    println(tmp)
}

// 素数判定
// そもそも小さい値から順に割っていけば素数で割った結果を得られる
fun isPrime(x: Int): Boolean {
    if (x == 2){
        return true
    }

    if (x < 2 || x % 2 == 0) {
        return false
    }

    var i = 3

    while (i <= Math.sqrt(x.toDouble()).toInt()) {
        if (x % i == 0) {
            return false
        }
        i += 1
    }
    return true
}