首先根据并联电路电阻的关系(逃,得到y>n!。
设y=n!+d,解得x=(n!)^2/d+d,所以只要d|n!即可。
于是筛出素数,n!中素因子pi的次数为[n/p]+[n/p^2]+[n/p^3]….,按这个方法对n!分解。最终答案即为n!的因数个数,为Π(2*pi+1)。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int mod=1000000007;
int n,pri[100010],c[100010],num=0;
bool flag[1000010];
void getpri(int n)
{
flag[1]=1;
for(int i=2;i<=n;i++)
{
if(!flag[i]) pri[++num]=i;
for(int j=1;j<=num&&i*pri[j]<=n;j++)
{
flag[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
int main()
{
scanf("%d",&n);
getpri(n);
long long ans=1;
for(int i=1;i<=num;i++)
{
int tmp=n;
while(tmp) {c[i]+=tmp/pri[i]; tmp/=pri[i];}
c[i]=((c[i]<<1)|1);
ans=ans*c[i]%mod;
}
printf("%lld",ans);
return 0;
}