题目描述
题解
设
n≠z,y=z+d
1x+1y=1z
1x+1z+d=1z
x+z+dx∗z+d=1z
z(x+z+d)=xz+dx
z2+dz=dx
x=z2d+z
发现就是求
z2
的约数个数
分解质因数随便做。。
转自黄学长的题解
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 1000005
#define Mod 1000000007
int n;
int p[N],prime[N],cnt[N],num[N];
void get()
{
for (int i=2;i<=n;++i)
{
if (!p[i]) prime[++prime[0]]=i,num[i]=prime[0];
for (int j=1;j<=prime[0]&&i*prime[j]<=n;++i)
{
p[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
void calc(int x)
{
for (int i=1;i<=prime[0]&&x>1&&prime[i]*prime[i]<=x;++i)
if (x%prime[i]==0)
{
while (x%prime[i]==0)
{
++cnt[i];
x/=prime[i];
}
}
if (x>1) ++cnt[num[x]];
}
int main()
{
scanf("%d",&n);
get();
for (int i=1;i<=n;++i) calc(i);
long long ans=1LL;
for (int i=1;i<=prime[0];++i)
ans=ans*(2*cnt[i]+1)%Mod;
printf("%lld\n",ans);
}