费马大定理:
勾股数
a2 + b2 = c2
已知a,求b和c:(在这里我们分两种情况,a是奇数和a是偶数的情况)
可以证明a2 + b2 = c2中符合的类型是奇2+ 偶2 = 奇2(在这里我们就不加以证明了)
1、a是奇数
设a = 2n+1,b = 2m,c = 2k+1;
(2n+1)2 + (2m)2 = (2k+1)2;
(2n+1)2 = (2k+1+2m) * (2k+1-2m);
令2k+1-2m = 1(因为保证要整除,而且2k+1-2m是奇数,所以我们设1)
所以
①2k+1-2m = 1;
②2k+1+2m = (2n+1)2;
解得:
2k+1 = 2n2 + 2n + 1;
2m = 2n2 + 2n;
2、a是偶数
设a = 2n,b = 2m+1,c = 2k+1;
(2n)2 + (2m+1)2 = (2k+1)2;
(2n)2 = (2k+2m+2) * (2k-2m);
令 2k-2m = 2;(与a是奇数同理)
所以
①2k - 2m = 2;
②2k+2m+2 = 2n2
解得
2k+1 = n * n+1;
2m+1 = n * n-1;
完整代码如下:
#include<iostream>
using namespace std;
void solve(){
long long a,b,c,n;
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){
if(a%2==0){
a /= 2;
printf("%lld %lld\n",a*a-1,a*a+1);
}
else{
a /= 2;
printf("%lld %lld\n",2*a*a+2*a,2*a*a+2*a+1);
}
}
else printf("-1 -1\n");
}
int main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}