设n!=z,y=z+d
1/x+1/y=1/z
1/x+1/(z+d)=1/z
(x+z+d)/(x*z+dx)=1/z
z(x+z+d)=x*z+dx
z^2+dz=dx
x=z^2/d+z
发现就是求z^2的约数个数
分解质因数随便做。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 1000005
#define LL long long
using namespace std;
int n,cnt;
const int mod=1e9+7;
LL ans=1;
int pri[maxn],mn[maxn],num[maxn];
bool used[maxn];
void getpri(){
for(int i=2;i<=n;i++){
if(!used[i]) pri[++cnt]=i,mn[i]=cnt;
for(int j=1;j<=cnt && pri[j]*i<=n;j++){
used[pri[j]*i]=1;
mn[pri[j]*i]=j;
if(i%pri[j]==0) break;
}
}
}
void cal(int x){
while(x!=1){
num[mn[x]]++;
x/=pri[mn[x]];
}
}
int main(){
scanf("%d",&n);
getpri();
for(int i=1;i<=n;i++)
cal(i);
for(int i=1;i<=cnt;i++)
ans=ans*(num[i]*2+1)%mod;
printf("%lld\n",ans);
return 0;
}