牛客练习赛51c-勾股定理

勾股定理

传送门.

题目描述

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

输入描述

一个整数n。

输出描述

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

示例

输入

3

输出

4 5

解题思路

1.易得当输入的数为0,1,2时,找不到勾股数,直接输出-1。
2.我们只需要输出一组正解,所以我们不妨设输入的数a为直角边,我们要输出一条斜边和另一条直角边。 a 2 a^2 a2= c 2 c^2 c2- b 2 b^2 b2
运用平方差公式可以得到 a 2 c − b \dfrac {a^2}{c-b} cba2= c + b c+b c+b
(1):我们首先考虑 c − b = 1 c-b=1 cb=1的情况
可以得到 a 2 = c + b = = > b = a 2 − 1 2 a^2=c+b\qquad ==>\qquad b=\dfrac {a^2-1}{2} a2=c+b==>b=2a21
同理 c = a 2 − 1 2 + 1 c=\dfrac {a^2-1}{2}+1 c=2a21+1
因为 a , b , c a,b,c a,b,c都是整数,所以 ( a 2 − 1 ) (a^2-1) (a21)%2=0,即可证 a a a为奇数,所以只要 a a a为奇数, b , c b,c b,c就是上面的公式。
(2):接下来我们考虑a为偶数的情况我们
思考可得我们只需要考虑 ( c − b ) (c-b) (cb)%2=0,为了简单,我们考虑 c − b c-b cb=2,
同理由平方差公式可以得到: a 2 = 2 ( c + b ) a^2=2(c+b) a2=2(c+b)
既: b = a 2 4 − 1 c = a 2 4 + 1 b=\dfrac {a^2}{4}-1\qquad c=\dfrac {a^2}{4}+1 b=4a21c=4a2+1
可得 a 2 a^2 a2一定是4的倍数,既证得偶数情况

AC代码

#include
long long a,b,c;
int main()
{
    scanf("%lld",&a);
    if(a==0||a==1||a==2)
        {
            printf("-1");
            return 0;
        }
    if(a%2==1)
        {
            b=(a*a-1)/2;
            c=b+1;
        }
    if(a%2==0)
        {
            b=((a*a)/2-2)/2;
            c=b+2;
        }
    printf("%lld %lld",b,c);
    return 0;
}

你可能感兴趣的:(牛客练习赛51c-勾股定理)