Problem
题目描述
丢番图是亚历山大时期埃及著名的数学家。他是最早研究整数系数不定方程的数学家之一。
为了纪念他,这些方程一般被称作丢番图方程。最著名的丢番图方程之一是 x n x^n xn+ y n y^n yn= z n z^n zn。费马提出,对于n≥2, x n x^n xn+ y n y^n yn= z n z^n zn没有正整数解。这被称为“费马大定理”,它的证明直到最近才被安德鲁·怀尔斯(Andrew Wiles)证明。
考虑如下的丢番图方程: 1 x + 1 y = 1 n \frac1x+\frac1y=\frac1n x1+y1=n1 ( x , y , n ∈ N + ) (x,y,n∈N^+) (x,y,n∈N+)
小G 对下面这个问题十分感兴趣:对于一个给定的正整数n ,有多少种本质不同的解满足该方程?例如n=4,有三种本质不同(x≤y)的解:
1 5 + 1 20 = 1 4 \frac15+\frac1{20}=\frac14 51+201=41
1 6 + 1 12 = 1 4 \frac16+\frac1{12}=\frac14 61+121=41
1
8
+
1
8
=
1
4
\frac18+\frac18=\frac14
81+81=41
~
样例输入
4
样例输出
3
数据范围
对于30%的数据, n≤
1
0
5
10^5
105
对于50%的数据, n≤
2
31
2^{31}
231
对于100%的数据,n≤
1
0
14
10^{14}
1014
Solution
思路
看到这道题目要求求解
1
x
\frac1 x
x1+
1
y
\frac1 y
y1=
1
n
\frac1 n
n1,直接这么求肯定是不好求的,我们考虑将这个式子变形:
通分得:
n
x
+
n
y
=
x
y
nx+ny=xy
nx+ny=xy
移项得:
x
y
−
n
x
−
n
y
=
0
xy-nx-ny=0
xy−nx−ny=0
整理,得:
x
y
−
n
(
x
+
y
)
=
0
xy-n(x+y)=0
xy−n(x+y)=0
∵
等
式
两
边
同
时
加
上
一
个
数
,
等
式
仍
然
成
立
\because等式两边同时加上一个数,等式仍然成立
∵等式两边同时加上一个数,等式仍然成立
∴
配
方
,
得
:
x
y
−
n
(
x
+
y
)
+
n
2
=
n
2
\therefore配方,得:xy-n(x+y)+n^2=n^2
∴配方,得:xy−n(x+y)+n2=n2
用十字相乘法因式分解,得:
(
x
−
n
)
(
y
−
n
)
=
n
2
(x-n)(y-n)=n^2
(x−n)(y−n)=n2
由此可以推出,只要(x-n)或者(y-n)中有一个是
n
2
n^2
n2的因数,那么方程就有一组解。
所以,我们只需要求出
n
2
n^2
n2的因数个数,将其除以2向上取正就好了。用数学的语言表述就是:令
d
(
x
)
d(x)
d(x)表示
x
x
x的因数个数,答案即为
⌈
d
(
n
2
)
2
⌉
\lceil\frac{d(n^2)}{2}\rceil
⌈2d(n2)⌉
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
long long n;
cin>>n;
long long ans=1,t=0;
for(int i=2;i<=sqrt(n);i++)
{
t=0;
if(n%i==0)
{
while(n%i==0)
{
n/=i;
t++;
}
ans*=(t*2+1);
}
if(n==1)
{
break;
}
}
if(n!=1)
{
ans*=3;
}
cout<<(ans+1)/2;
}