HDUOJ 6441整数を検索
問題の説明
USSSの人々は数学を非常に愛しており、有名な数学の問題があります。
2つの整数n、aを与えると、2つの整数b、cを見つけて、an + bn = cna ^ n + b ^ n = c ^ nとなるようにする必要があります。aん+bん=cn。
入力
1行に1つの整数Tが含まれます(1≤T≤1000000)
次のT行には2つの整数n、aが含まれています(0≤n≤1000,000,000,3≤a≤40000)
出力
b、cが存在する場合、2つの整数b、cを出力します((1≤b、c≤1000,000,000);
そうでない場合は、代わりに2つの整数-1 -1を出力します。
入力例
1
2 3
出力例
4 5
質問を考える〜
最初に、フェルマーの最後の定理によると、n> 2 n> 2のときん>場合2〜全く正の整数解があってはならない
場合、N = 0、N = 0ん=0では、〜明らかに解決策が存在しない
ときのn = 1からn = 1ん=1の場合、出力1 11 和 a + 1 a+1 a+n = 2
、n = 2の場合、 1で十分です。ん=2時時、タイトルの上限は、正の整数でなければならないことに注意してください、我々はのために、パリティを考えるAAaは奇数、a 2 a ^ 2a2は 2に分割できます* 1 a ^ 2 * 1a2∗1 ;aaへaは偶数、2 a ^ 2a2は 2 2に分割できます2 ∗ 2 \ frac {a ^ 2} {2} * 22a2∗2.バイナリ線形方程式を個別に解きます〜
出力順序に注意してください。ACコードは次のとおりです:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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==2){
if(a%2) printf("%d %d\n",(a*a-1)/2,(a*a+1)/2);
else printf("%d %d\n",a*a/4-1,a*a/4+1);
}else if(n==1){
printf("1 %d\n",a+1);
}
}
return 0;
}