HDUOJ 6441整数を検索

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 * 1a21 ;aaへaは偶数、2 a ^ 2a2 2 2に分割できます2 ∗ 2 \ frac {a ^ 2} {2} * 22a22.バイナリ線形方程式を個別に解きます〜
出力順序に注意してください。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;
}

おすすめ

転載: blog.csdn.net/qq_43765333/article/details/108670681