就是给你n,a求出一组b,c满足a ^ n + b ^ n = c ^ n
由于费马大定理得:当n> 2时,此方程式无解,
然后观察 当n = 0时,显然无解,
所以我们只需要讨论n = 1和n = 2的情况,
n = 1的时,随便写个答案就行了,
n = 2的时,这里需要运用到勾股定理的一点技巧:
1,当a为大于1的奇数2n + 1时,b = 2 * n ^ 2 + 2 * n,c = 2 * n ^ 2 + 2 * n + 1.
实际上就是把a的平方数拆成两个连续自然数,例如:
n = 1时(a,b,c)=(3,4,5)
n = 2时(a,b,c)=(5,12,13)
n = 3时( a,b,c)=(7,24,25)
......
这是最经典的一个套路,而且由于两个连续自然数必然互质,所以用这个套路得到的勾股数组全部都是互质的
.2,当a为大于4的偶数2n时,b = n ^ 2-1,c = n ^ 2 + 1
也就是把a的一半的平方分别减1和加1,例如:
n = 3时(a,b,c)=(6,8,10)
n = 4时(a,b,c)=(8,15,17)
n = 5时(a,b,c)=(10 ,24,26)
n = 6时(a,b,c)=(12,35,37)
......所以n = 2的时,用公式就可以得出结果了,这样就不存在超时的问题了。
#include<stdio.h>
#include<math.h>
int main()
{
long long n,m,j,k,i,T,a,b,c;
scanf("%lld",&T);
while (T--)
{
scanf("%lld%lld",&n,&a);
if (n>2 || n==0)
{
printf("-1 -1
");
}
else if (n==1)
{
printf("1 %lld
",a+1);
}
else if (n==2)
{
bool flag=0;
if (a%2!=0)
{
long long x = (a-1)/2;
long long b = 2*x*x+2*x;
long long c = 2*x*x+2*x+1;
printf("%lld %lld
",b,c);
flag=1;
}
else if (a%2==0)
{
long long x = a/2;
long long b = x*x-1;
long long c = x*x+1;
printf("%lld %lld
",b,c);
flag=1;
}
if (flag==0)
printf("-1 -1
");
}
}
return 0;
}