牛客练习赛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均为整数

题解:

参考博客:http://blog.sina.com.cn/s/blog_4fe777090102wjds.html

直角三角形的有两个通项公式: 

1.  a=2n+1,b=2n*n+2n,c=2n*n+2n+1,

2. a=n*n-1,b=2n,c=n*n+1

那么输入的 边的长度如果是奇数,用公式1,把输入的边当成a ,求出n,然后求出b和c

如果 输入的边的长度是 偶数,那么用公式2,把输入的边当成b,求出n,然后求出a和c 

代码:  

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
char s[maxn];
int main(){
    ll n,a,b;
    cin>>n;
    if(n<=2) puts("-1");
    else if(n%2==0){
        ll x=n/2;
        cout<

牛客给的题解:
对小范围数据进行打表,即可发现存在以下规律:
1.当n>2时总有方法可以构造
2.当n是奇数总存在两条边b,c使得c-b==1并且n^2+b^2=c^2
3.当n是偶数总存在两条边b,c使得c-b==2并且n^2+b^2=c^2
因此我们可以设边c=x,分n是奇数和偶数的情况,有
1.n是奇数,b=x-1->n^2+(x-1)^2=x^2->x=(n^2+1)/2
2.n是偶数,b=x-2->n^2+(x-2)^2=x^2->x=(n^2+4)/4
于是可以O(1)求出答案

代码:

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
char s[maxn];
int main(){
    ll n,a,b;
    cin>>n;
    if(n<=2) puts("-1");
    else if(n%2==1){
        ll x=(n*n+1)/2;
        cout<

 

 

你可能感兴趣的:(几何)