鏈接: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;
}