题意
给定一个整数
n
\rm n
n,求方程
1
x
+
1
y
=
1
n
!
\dfrac1x+\dfrac1y=\dfrac1{n!}
x1+y1=n!1 的正整数解的组数。
其中
1
≤
n
≤
1
0
6
1 \le n \le 10^6
1≤n≤106。
思路
原方程左边通分得
x
+
y
x
y
=
1
n
!
\dfrac{x+y}{xy}=\dfrac{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
(n!)^2
(n!)2,得
(
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
!
a=x-n!
a=x−n!,
b
=
y
−
n
!
b=y-n!
b=y−n!,则
a
b
=
(
n
!
)
2
ab=(n!)^2
ab=(n!)2
由唯一分解定理知
n
!
=
∏
i
=
1
k
p
i
c
i
n!=\prod\limits_{i=1}^kp_i^{c_i}
n!=i=1∏kpici
则
(
n
!
)
2
=
∏
i
=
1
k
p
i
2
c
i
(n!)^2=\prod\limits_{i=1}^kp_i^{2c_i}
(n!)2=i=1∏kpi2ci
即
a
b
=
∏
i
=
1
k
p
i
2
c
i
ab=\prod\limits_{i=1}^kp_i^{2c_i}
ab=i=1∏kpi2ci
∵
n
!
∵n!
∵n!是确定的
∴
∴
∴ 确定了
a
,
b
a,b
a,b,就能确定
x
,
y
x,y
x,y。
\quad
而且只要确定了
a
a
a,就能确定
b
b
b。
∵
a
∵a
∵a 是
(
n
!
)
2
(n!)^2
(n!)2 的因式
∴
a
∴a
∴a有
∏
i
=
1
k
(
2
c
i
+
1
)
\prod\limits_{i=1}^k(2c_i+1)
i=1∏k(2ci+1) 种取值
那么答案就是
∏
i
=
1
k
(
2
c
i
+
1
)
 
m
o
d
 
(
1
0
9
+
7
)
\prod\limits_{i=1}^k(2c_i+1)\bmod(10^9+7)
i=1∏k(2ci+1)mod(109+7)
(以上推导过程转载自M_sea神仙的题解,如果 M _ s e a \rm M\_sea M_sea 神仙不同意我的行为,请告诉我,我将很快删除这一段qwq)
代码
const
nn=1000000;
mo=1000000007;
var
a,s,v:array[0..nn+10] of longint;
i,j,cnt,n,t:longint;
ans:int64; //安全起见,防止爆炸
begin
read(n);
fillchar(s,sizeof(s),0);
cnt:=0;
fillchar(v,sizeof(v),0);
for i:=2 to n do
begin
if v[i]=0 then
begin
inc(cnt);
a[cnt]:=i;
v[i]:=i;
end;
for j:=1 to cnt do
begin
t:=a[j];
if (t>v[i]) or (t*i>n) then break;
v[t*i]:=a[j];
end;
end; //线性筛法求素数
for i:=2 to n do 对n!进行质因数分解
begin
t:=i;
while t<>1 do
begin
inc(s[v[t]]);
t:=t div v[t]; //因为v[t]必然是t的因子
end;
end;
ans:=1;
for i:=1 to cnt do
ans:=ans*(s[a[i]] shl 1+1) mod mo; //计算答案
writeln(ans);
end.
时间复杂度为 O ( n log n ) \mathcal O(n\log n) O(nlogn)