interviewstreet--EQUATIONS
题解:线性筛+质因数分解
这道题的答案是(n!)^2的约数个数,然而我并不知道为什么,找了1个多小时的规律。。。。。
还是说一下靠谱的做法吧。
设n!=z,y=z+d
1/x+1/y=1/z => 1/x+1/(z+d)=1/z
(x+z+d)/(x*z+x*d)=1/z
z*(x+z+d)=x*z+d*z
z^2+d*z=d*x
x=z^2/d+z 因为x是正整数,所以d是z^2的因数。。。。
#include
#include
#include
#include
#include
#define N 1000003
#define p 1000000007
#define LL long long
using namespace std;
int n,prime[N],mp[N],num[N],pd[N];
void init()
{
for (int i=2;i<=1000000;i++) {
if (!pd[i]) prime[++prime[0]]=i,mp[i]=prime[0];
for (int j=1;j<=prime[0];j++){
if (i*prime[j]>1000000) break;
pd[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
void calc(int x,int val)
{
int k=x;
for (int i=1;prime[i]*prime[i]<=k;i++)
if (k%prime[i]==0) {
while (k%prime[i]==0) num[i]++,k/=prime[i];
}
if (k>1) num[mp[k]]++;
}
int main()
{
init();
scanf("%d",&n);
for (int i=1;i<=n;i++) calc(i,1);
LL ans=1;
for (int i=1;i<=prime[0];i++)
ans=ans*(LL)(num[i]*2+1)%p;
printf("%I64d\n",ans);
}