题意:
求不定方程:
$$\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$$
的正整数解 $(x,y)$ 的数目。
数据范围: $1\le n\le 10^6$
题解:
对不定方程变形:
$$(x-n!)(y-n!)=(n!)^2$$
设 $a=(x-n!),b=(y-n!)$ ,则:
$$ab=(n!)^2$$
由算术基本定理得:
$$n!=\prod p_i^{a_i}$$
所以:
$$ab=\prod p_i^{2a_i}$$
因为 $x$ 与 $a$ , $y$ 与 $b$ 一一对应,且 $x,y$ 成对出现,所以只需要确定 $a$ 便可以确定一个解。而 $a$ 为 $n!$ 的因式,共有 $\prod (2a_i+1)$ 个。答案即为 $a$ 的个数。
代码:
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int n;
int cnt,ans=1;
bool isP[N];
int pri[N],a[N];
inline void siftPrime(){
memset(isP,1,sizeof(isP));
for(int i=2;i<=n;i++){
if(isP[i])
pri[++cnt]=i;
for(int j=1;j<=cnt && i*pri[j]<=n;j++){
isP[i*pri[j]]=0;
if(i%pri[j]==0)
break;
}
}
}
signed main(){
scanf("%lld",&n);
siftPrime();
for(int i=1;i<=cnt;i++)
for(int j=pri[i];j<=n;j*=pri[i])
(a[i]+=n/j)%=mod;
for(int i=1;i<=cnt;i++)
(ans*=(a[i]*2+1))%=mod;
printf("%lld",ans);
return 0;
}