牛客練習賽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<bits/stdc++.h>
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<<x*x-1<<" "<<x*x+1<<endl;
    }else{
        ll x=(n-1)/2;
        cout<<2*x*x+2*x<<" "<<2*x*x+2*x+1<<endl;
    }
    return 0;
}

牛客給的題解:
對小範圍數據進行打表,即可發現存在以下規律:
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<bits/stdc++.h>
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<<x-1<<" "<<x<<endl;
    }else{
        ll x=(n*n+4)/4;
        cout<<x-2<<" "<<x<<endl;
    }
    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章