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
}