Codeforces Round #368 (Div. 2) C. Pythagorean Triples
题目链接:http://codeforces.com/contest/707/problem/C
题意:
直角三角形的三边都为整数,给出其中一边n,求另外两边m、k。
(1 ≤ n ≤ 109) (1 ≤ m, k ≤ 1018)
分析:
假设直角三角形的斜边长为c,直角边为n,a。
则根据勾股定理有a2+n2=c2
变形得到:n2 = (c+a)(c-a)
即因式分解
当n为奇数时,c-a = 1,c+a = n2
当n为偶数时,c-a = 2,c+a = n2/2
联立可得到c、a的表达式
(分n为奇数和偶数讨论,得到n2因式分解时一定有1和2两个因数,从而构造出可行解)
当n=1和2时,无解要进行特判。
代码:
#include<cstdio> #include<algorithm> #include<map> #include<cstring> #include<string> #include<iostream> #include<set> #include<vector> #include<cmath> using namespace std; typedef long long ll; const int mod = 1000000007; const int maxn = 200010; int main() { ll n,c,a; while(~scanf("%I64d",&n)) { if(n<3) { printf("-1\n"); continue; } if(n&1) { c = (n*n+1)/2; a = (n*n-1)/2; } else { c = n*n/4+1; a = n*n/4-1; } printf("%I64d %I64d\n",c,a); } return 0; }