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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
	//素因数分解を行う関数
	//所謂「試し割り法」を使う。配列（素因数とその指数）のリストを返す。
	//タイプはulongとする
	static List<ulong[]> TrialDivision(ulong n)
	{
		List<ulong[]> primeFactors = new List<ulong[]>();

		//入力値の平方根
		ulong root = (ulong)Math.Sqrt(n);

		//カウンター（当該素因数で割った回数）、割る数、割られる数
		ulong cnt = 0;
		ulong div = 2;
		ulong tmp = n;

		//平方根を超えるまでループ
		while(div <= root){
			//素因数に持つ場合、割ることができる回数だけ割り続ける
			//(cntの値は、当該素数で何回割れるかを示す（p^aのaに該当）)
			if(tmp % div == 0){
				cnt ++;
				tmp /= div;
			}
			//割り切れない場合
			else{
				//cnt > 0の場合、素因数divで可能な限り割った以後である
				//（cnt = 0の場合、divは素因数ではない）
				if(cnt != 0){
					//素因数と、割った回数とを追加
					ulong[] set = new ulong[2]{div, cnt};
					primeFactors.Add(set);
					//割った回数を初期化
					cnt = 0;
				}
				//次へ
				div += 1;
			}
		}

		//割った結果残ったのが1でない場合、当該素数も素因数である
		if(tmp != 1){
			ulong[] set = new ulong[2]{tmp, 1};
			primeFactors.Add(set);
		}

		//出力
		return primeFactors;
	}

	//Main
	static void Main(string[] args)
	{
		//読み込む
		int N = int.Parse(Console.ReadLine());

		//mod
		ulong mod = 1000000007;

		//素因数分解の結果（素因数と指数のセット）を格納するディクショナリ
		Dictionary<ulong,ulong> primeDict = new Dictionary<ulong,ulong>();

		//N!を構成する因数について、順番に素因数分解を行う
		for(int i=1; i<N+1; i++){
			List<ulong[]> primeFactors = TrialDivision((ulong)i);

			//各素因数の指数を、全体の素因数分解のディクショナリに追加
			foreach(ulong[] set in primeFactors){
				//既に素因数がキーとして含まれている場合
				if(primeDict.ContainsKey(set[0])){
					//加算
					primeDict[set[0]] += set[1];
				}
				//含まれていない場合
				else{
					//新たに追加
					primeDict.Add(set[0],set[1]);
				}
			}
		}

		ulong ans = 1;
		//各素因数の指数を掛け合わせていく（組み合わせの数）
		foreach(KeyValuePair<ulong,ulong> set in primeDict){
			ans *= (set.Value+1);
			ans %= mod;
			//Console.WriteLine("prime:{0},exp:{1}", set.Key, set.Value);
		}

		Console.WriteLine(ans);

	}
}