源代码:
#include<cstdio>
#define LL long long
#define INF 100000007LL
LL n,Num(0),Ans=1,Sum[350000]={0},Prime[350000];
bool Flag[5000001]={0};
LL Count(LL S,LL X) //快速幂。
{
LL Number=1;
while (S)
{
if (S&1)
Number=(Number*X)%INF;
X=(X*X)%INF;
S>>=1;
}
return Number;
}
void Euler() //欧拉筛法。
{
for (LL a=2;a<=n;a++)
{
if (!Flag[a])
Prime[Num++]=a;
for (LL b=0;b<Num&&a*Prime[b]<=n;b++)
{
Flag[a*Prime[b]]=true;
if (!(a%Prime[b]))
break;
}
}
}
int main()
{
scanf("%lld",&n);
Euler();
for (LL a=0;a<Num;a++) //那个方法。
{
LL t=n;
while (t)
{
Sum[a]+=t/Prime[a];
t/=Prime[a];
}
}
for (LL a=0;a<Num;a++)
if (Sum[a]&1) //完全可以用素数独苗来填补空缺。
Ans=(Ans*Count(Sum[a]-1,Prime[a]))%INF;
else
Ans=(Ans*Count(Sum[a],Prime[a]))%INF;
printf("%lld",Ans);
return 0;
}
/*
从1~N中选若干个数相乘,使其形成解,可以转化为:从1~N中选若干个数,作为N!的约数。
阶乘分解质因数后,会发现规律。
*/