Find Integer
Problem Description
people in USSS love math very much, and there is a famous math problem .
give you two integers n,a,you are required to find 2 integers b,c such that a{n}+b{n} = c^{n}
Input
one line contains one integer T;(1 \le T\le1000000)
next T lines contains two integers n,a;(0 \le n \le1000,000,000,3 \le a \le 40000)
Output
print two integers b,c if b,c exits;(1 \le b,c \le 1000,000,000);
else print two integers -1 -1 instead.
Sample Input
1
2 3
Sample Output
4 5
题意
输出符合公式 an+bn=c^n 的一对 b 和 c ;
T n a b c 各自的取值范围:
(1≤T≤1000000)
(0≤n≤1000,000,000,3≤a≤40000)
(1≤b,c≤1000,000,000)
思路
当n0时显然不能1+1=1;
当n1时符合a+b=c,显然b=1,c=a+1;
当n>2时由费马大定理可知
给出链接->费马大定理
n>=3一定无解(数学很重要)
当n==2时,就是勾股定理了
{ 3,4,5
6 ,8 ,10
5 ,12 ,13
… … …
}
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
long long a, b, c;
int t;
cin >> t;
long long n;
while(t--){
scanf("%lld%lld", &n, &a);
if(n == 0){
printf("-1 -1\n");
}
else if(n == 1){
printf("1 %lld\n", a+1);
}
else if(n > 2){
printf("-1 -1\n");
}
else{
long long mul = a*a;
if(mul & 1){
printf("%lld %lld\n", (mul-1)/2, (mul+1)/2);
}
else{
b = (mul-4)/4;
c = b+2;
printf("%lld %lld\n", b, c);
}
}
}
return 0;
}