题目大意:
题目链接:
BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=2721
洛谷:https://www.luogu.org/problemnew/show/P1445
求方程 1 x + 1 y = 1 n ! \frac{1}{x}+\frac{1}{y}=\frac{1}{n!} x1+y1=n!1 的正整数解的组数
思路:
神题啊 o r z orz orz
以下内容大部分摘自 这里
先通分
x
+
y
x
y
=
1
n
!
\frac{x+y}{xy}=\frac{1}{n!}
xyx+y=n!1
交叉相乘
(
x
+
y
)
n
!
=
x
y
(x+y)n!=xy
(x+y)n!=xy
移项得
−
(
x
+
y
)
n
!
+
x
y
=
0
-(x+y)n!+xy=0
−(x+y)n!+xy=0
配方
(
n
!
)
2
−
(
x
+
y
)
n
!
+
x
y
=
(
n
!
)
2
(n!)^2-(x+y)n!+xy=(n!)^2
(n!)2−(x+y)n!+xy=(n!)2
(
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
由于
n
!
=
p
1
c
1
×
p
2
c
2
×
.
.
.
×
p
m
c
m
n!=p_1^{c1}\times p_2^{c2}\times ...\times p_m^{cm}
n!=p1c1×p2c2×...×pmcm,所以
(
n
!
)
2
=
p
1
2
c
1
×
p
2
2
c
2
×
.
.
.
×
p
m
2
c
m
(n!)^2=p_1^{2c1}\times p_2^{2c2}\times ...\times p_m^{2cm}
(n!)2=p12c1×p22c2×...×pm2cm
所以总共
a
a
a的取值就是
(
2
c
1
+
1
)
(
2
c
2
+
1
)
.
.
.
(
2
c
m
+
1
)
(2c_1+1)(2c_2+1)...(2c_m+1)
(2c1+1)(2c2+1)...(2cm+1)
枚举
1
∼
n
1\sim n
1∼n,把每个数字分解质因数就可以求出答案了。
代码:
#include <cstdio>
#define rr register
using namespace std;
typedef long long ll;
const int MOD=1e9+7,N=1e6+10;
int n,prime[N],m,v[N];
ll cnt[N],ans;
void find_prime(int k)
{
for (rr int i=2;i<=n;i++)
{
if (!v[i])
{
v[i]=i;
prime[++m]=i;
}
for (rr int j=1;j<=m;j++)
{
if (prime[j]>v[i]||prime[j]*i>n) break;
v[i*prime[j]]=prime[j];
}
}
}
int main()
{
scanf("%d",&n);
find_prime(n);
for (rr int i=1;i<=n;i++)
for(rr int j=i;j!=1;j/=v[j])
cnt[v[j]]++;
ans=1;
for (rr int i=1;i<=m;i++)
ans=(ans*(cnt[prime[i]]*2+1))%MOD;
printf("%d",ans);
return 0;
}