(x-n!)*(y-n!)=(n!)^2
分解 n! 的质因数即可。分解时,需要优化下。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000100;
const long long mod=1e9+7;
int npri[MAXN],prime[MAXN],sum[MAXN];
long long powmod(long long x,long long p)
{
long long ret=1;
while(p)
{
if(p&1)
ret=x*ret%mod;
x=x*x%mod;
p>>=1;
}
return ret;
}
int main()
{
long long i,j,n,tmp,ans,prisum=0;
for(i=2;i<MAXN;i++)
{
if(!npri[i])
{
prime[prisum++]=i;
for(j=i+i;j<MAXN;j+=i)
npri[j]=1;
}
}
while(~scanf("%lld",&n))
{
memset(sum,0,sizeof(sum));
for(i=0;i<prisum;i++)
{
tmp=n;
while(tmp)
{
sum[i]+=tmp/prime[i];
tmp/=prime[i];
}
}
ans=1;
for(i=0;i<prisum;i++)
{
ans=(ans*((sum[i]<<1)+1))%mod;
}
printf("%lld\n",(ans+1)*powmod(2,mod-2)%mod);
}
}