牛客练习赛51 C 勾股定理
链接:https://ac.nowcoder.com/acm/contest/1083/C
题目描述
给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形。
输入描述:
一个整数n。
输出描述:
另外两条边b,c。答案不唯一,只要输出任意一组即为合理,如果无法构造请输出-1。
备注:
0<=n<=1e9
1<=b,c<=1e18
n,b,c均为整数
勾股数:
第一类型
当a为大于1的奇数2n+1时,b=2n²+2n, c=2n²+2n+1。
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; }