题目大意:
题目链接:https://www.luogu.org/problem/P5253
给出
n
n
n,求
1
x
+
1
y
=
1
n
\frac{1}{x}+\frac{1}{y}=\frac{1}{n}
x1+y1=n1本质不同的解。
思路:
和 樱花 那道题基本一样,所以很快就推出来了。
通分
x
y
x
+
y
=
n
\frac{xy}{x+y}=n
x+yxy=n
移项
−
n
(
x
+
y
)
+
x
y
=
0
-n(x+y)+xy=0
−n(x+y)+xy=0
配方
n
2
−
n
(
x
+
y
)
+
x
y
=
n
2
n^2-n(x+y)+xy=n^2
n2−n(x+y)+xy=n2
(
n
−
x
)
(
n
−
y
)
=
n
2
(n-x)(n-y)=n^2
(n−x)(n−y)=n2
所以如果我们
n
2
n^2
n2分解质因数即可。然后两两配对。
若
n
=
c
1
p
1
×
c
2
p
2
×
.
.
.
×
c
n
p
n
n=c_1^{p_1}\times c_2^{p_2}\times ...\times c_n^{p_n}
n=c1p1×c2p2×...×cnpn,则
n
=
c
1
2
p
1
×
c
2
2
p
2
×
.
.
.
×
c
n
2
p
n
n=c_1^{2p_1}\times c_2^{2p_2}\times ...\times c_n^{2p_n}
n=c12p1×c22p2×...×cn2pn
时间复杂度
O
(
n
)
O(\sqrt{n})
O(n)
代码:
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1e7+10;
ll n,tot,ans,c[N];
int main()
{
scanf("%lld",&n);
for (ll i=2;i*i<=n;i++)
if (!(n%i))
{
tot++;
for (;!(n%i);n/=i)
c[tot]++;
}
if (n>1) c[++tot]++;
ans=1;
for (int i=1;i<=tot;i++)
ans*=(c[i]*2+1);
printf("%lld",(ans+1)/2LL);
return 0;
}