HDU 6441 Find Integer
题目
对于公式 a n + b n = c n a^n+b^n=c^n an+bn=cn。给出 n,a,找 b,c 的正整数解。不行输出-1 -1。
分析
首先给出的公式就是费马大定理。 当 n > 2时,没有正整数解。
考虑 n = 0, 1, 2。前两种很容易得出。
当 n 等于 2,就变成了勾股定理 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2。对于勾股数的求解。有一个本原勾股数组。指勾股数中两两互质的勾股数,其他勾股数可以由其翻倍得出。
公式:
a
=
2
m
n
b
=
m
2
−
n
2
c
=
m
2
+
n
2
\begin{array}{l}{a= 2 m n} \\ {b=m^{2}-n^{2}} \\ {c=m^{2}+n^{2}}\end{array}
a=2mnb=m2−n2c=m2+n2
令 n = 1,
当 a 为偶数时,
a
=
2
m
,
b
=
(
a
/
2
)
2
−
1
,
c
=
(
a
/
2
)
2
+
1
a = 2m, b = (a/2)^2-1,c = (a/2)^2+1
a=2m,b=(a/2)2−1,c=(a/2)2+1
当 a 为奇数时,方程两边除二:
a
=
m
b
=
(
a
2
−
1
)
/
2
c
=
(
a
2
+
1
)
/
2
\begin{array}{l}{a= m } \\ {b=(a^{2}-1)/2} \\ {c=(a^{2}+1)/2}\end{array}
a=mb=(a2−1)/2c=(a2+1)/2
剩下的直接代公式。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define fuck(x) cout<<x<<endl
const int N = 1e5 + 5;
const ll mod = 1e9 + 7;
int t, n, a;
int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &a);
if(n > 2 || n == 0){
printf("-1 -1\n");
}else if(n == 1){
printf("1 %d\n", a + 1);
}else{
double x = a / 2.0;
if(a%2){
printf("%.0lf %.0lf\n", a * x - 0.5, a * x + 0.5);
}else{
printf("%.0lf %.0lf\n", x * x - 1, x * x + 1);
}
}
}
return 0;
}
/*
*/