HDU 6441 Find Integer(本原勾股数公式)

HDU 6441 Find Integer

题目

对于公式 a n + b n = c n a^n+b^n=c^n an+bn=cn。给出 n,a,找 b,c 的正整数解。不行输出-1 -1。

分析

首先给出的公式就是费马大定理。 当 n > 2时,没有正整数解。

考虑 n = 0, 1, 2。前两种很容易得出。

当 n 等于 2,就变成了勾股定理 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2。对于勾股数的求解。有一个本原勾股数组。指勾股数中两两互质的勾股数,其他勾股数可以由其翻倍得出。

公式: a = 2 m n b = m 2 − n 2 c = m 2 + n 2 \begin{array}{l}{a= 2 m n} \\ {b=m^{2}-n^{2}} \\ {c=m^{2}+n^{2}}\end{array} a=2mnb=m2n2c=m2+n2
令 n = 1,
当 a 为偶数时, a = 2 m , b = ( a / 2 ) 2 − 1 , c = ( a / 2 ) 2 + 1 a = 2m, b = (a/2)^2-1,c = (a/2)^2+1 a=2m,b=(a/2)21,c=(a/2)2+1

当 a 为奇数时,方程两边除二:
a = m b = ( a 2 − 1 ) / 2 c = ( a 2 + 1 ) / 2 \begin{array}{l}{a= m } \\ {b=(a^{2}-1)/2} \\ {c=(a^{2}+1)/2}\end{array} a=mb=(a21)/2c=(a2+1)/2
剩下的直接代公式。

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define INF 0x3f3f3f3f
#define fuck(x) cout<<x<<endl
const int N = 1e5 + 5;
const ll mod = 1e9 + 7;

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 == 1){
            printf("1 %d\n", a + 1);
        }else{
            double x = a / 2.0;
            if(a%2){
                printf("%.0lf %.0lf\n", a * x - 0.5, a * x + 0.5);
            }else{
                printf("%.0lf %.0lf\n", x * x - 1, x * x + 1);
            }
        }
    }
    return 0;
}

/*

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值