牛客练习赛51 C 勾股定理

 

链接:https://ac.nowcoder.com/acm/contest/1083/C


题目描述

给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形。

输入描述:

一个整数n。

输出描述:

另外两条边b,c。答案不唯一,只要输出任意一组即为合理,如果无法构造请输出-1。
示例1

输入

复制
3

输出

复制
4 5
示例2

输入

复制
4

输出

复制
3 5

备注:

0<=n<=1e9

1<=b,c<=1e18

n,b,c均为整数


勾股数:

第一类型

当a为大于1的奇数2n+1时,b=2n²+2n, c=2n²+2n+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²-1, c=n²+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)
 
#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    if(n>1&&n&1)
    {
        long long t=(n-1)/2;
        long long  b=2*t*t+2*t;
        long long c=2*t*t+2*t+1;
        cout << b << " " << c << endl;
    }
    else if(n>=4&&n%2==0)
    {
        long long t=n/2;
        long long b=t*t-1;
        long long c=t*t+1;
        cout << b << " " << c << endl;
    }
    else
        cout << -1 << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/wjc2021/p/11479712.html