原题见洛谷。
首先可以化成这样的形式:
然后对于N!的质因子分解应该不是难事,可以很快得到每个质因子的次数。由于有个平方,右边的次数还要乘2。
左边可以完全不管内容,只是把它当作两个数a,b相乘。于是a,b相乘后,每个质因子次数之和,分别等于N!每个质因子的次数乘2,直接扫一遍乘完就行。
#include<cstdio>
using namespace std;
typedef long long LL;
const LL mod=1000000007;
const int MAXN=1000000;
int N,vis[MAXN+5],tot=0,cnt[MAXN];
LL prime[MAXN];
void get_prime()
{
for(int i=2;i<=N;i++)
{
if(!vis[i]) prime[++tot]=i;
for(int j=1;j<=tot&&prime[j]*i<=N;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
void solve()
{
for(int i=1;i<=tot;i++)
for(LL j=prime[i];j<=N;j*=prime[i])
cnt[i]+=N/j;
LL ans=1;
for(int i=1;i<=tot;i++) ans=(ans*(cnt[i]*2+1))%mod;
printf("%lld",ans);
}
int main()
{
scanf("%d",&N);
get_prime();
solve();
return 0;
}