源代码: #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!的约数。 阶乘分解质因数后,会发现规律。 */