unittest
{
	assert( [ "3" ].parse.expand.solve == 4 );
	assert( [ "6" ].parse.expand.solve == 30 );
	assert( [ "1000" ].parse.expand.solve == 972926972 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	return tuple( n );
}

const MOD = 10 ^^ 9 + 7;

auto solve( long n )
{
	long[ long ] ms;
	
	// 階乗の各項を素因数分解する
	for( auto i = 2L; i <= n; i++ )
	{
		auto r = i;
		foreach( p; n.primes )
		{
			if( r < 2 ) break;
			
			auto m = 1L;
			while( r % p == 0 )
			{
				r /= p;
				if( p !in ms ) ms[ p ] = 1;
				else           ms[ p ]++;
			}
		}
	}
	
	// 素因数分解した結果の各乗数+1を掛け算すると約数の個数が出る
	auto ans = 1L;
	foreach( m; ms )
	{
		ans = ans * ( m + 1 ) % MOD;
	}
	return ans;
}

auto primes( long n )
{
	static memo = [ 2L ];
	static n_max = 2L;
	
	if( n <= n_max ) return memo.retro.find!( ( a ) => a <= n ).retro;
	
	for( auto i = n_max + 1; i <= n; i++ )
	{
		if( !memo.canFind!( ( a ) => i % a == 0 ) ) memo ~= i;
	}
	n_max = n;
	
	return memo;
}
