题目:求 1 x + 1 y = 1 n ! \frac{1}{x}+\frac{1}{y}=\frac{1}{n!} x1+y1=n!1
将原式进行恒等变换:
x
+
y
x
y
=
1
n
!
\frac{x+y}{xy}=\frac{1}{n!}
xyx+y=n!1
n
!
(
x
+
y
)
=
x
y
n!(x+y)=xy
n!(x+y)=xy
x
y
−
n
!
(
x
+
y
)
xy-n!(x+y)
xy−n!(x+y)
观察系数,很难 可以联想到因式分解十字相乘:
可得:
(
x
−
n
!
)
(
y
−
n
!
)
=
(
n
!
)
2
(x-n!)(y-n!)=(n!)^2
(x−n!)(y−n!)=(n!)2
令
a
=
x
−
n
!
,
b
=
y
−
n
!
a=x-n!,b=y-n!
a=x−n!,b=y−n!
则:
a
b
=
(
n
!
)
2
ab=(n!)^2
ab=(n!)2
因为有序数对
(
x
,
y
)
(x,y)
(x,y)与
(
a
,
b
)
(a,b)
(a,b)一一对应
将
n
!
n!
n!进行质因数分解
设
n
!
=
p
1
a
1
∗
p
2
a
2
∗
.
.
.
∗
p
n
a
n
n!=p_1^{a_1}*p_2^{a_2}*...*p_n^{a_n}
n!=p1a1∗p2a2∗...∗pnan
则
a
b
ab
ab是该方程一组解的充要条件是
a
a
a是
n
!
n!
n!的约数,
b
=
n
/
a
b=n/a
b=n/a
问题转化为求n!的约数个数
∏
i
=
1
n
(
a
i
+
1
)
\prod_{i=1}^n(a_i+1)
i=1∏n(ai+1)
用线性筛即可求解
具体见代码
C o d e Code Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=1e6,Mod=1e9+7;
int prime[MAXN+10],vis[MAXN+10],tot=0;
int c[MAXN+10];
void euler(int);
signed main(){
//freopen ("std.in","r",stdin);
//freopen ("std.out","w",stdout);
int n;
scanf("%lld",&n);
euler(n);
for (register int i=1;i<=tot;++i){
int x=prime[i];
for (register int j=x;j<=n;j*=x) c[i]=(c[i]+(n/j))%Mod;
}
long long ans=1;
for (register int i=1;i<=tot;++i){
ans=ans*(c[i]<<1|1)%Mod;
}
printf("%lld\n",ans);
return 0;
}
void euler(int n){
memset(vis,0,sizeof(vis));
for (register int i=2;i<=n;++i){
if (!vis[i]){vis[i]=i,prime[++tot]=i;}
for (register int j=1;j<=tot;++j){
if (vis[i] < prime[j] || i*prime[j]>n) break;
vis[i*prime[j]]=prime[j];
}
}
}