题目连接:http://codeforces.com/contest/707/problem/Cios
题意:ide
直角三角形的三边都为整数,给出其中一边n,求另外两边m、k。spa
(1 ≤ n ≤ 109) (1 ≤ m, k ≤ 1018)code
分析:blog
假设直角三角形的斜边长为c,直角边为n,a。get
则根据勾股定理有a2+n2=c2string
变形获得:n2 = (c+a)(c-a)it
即因式分解io
当n为奇数时,c-a = 1,c+a = n2event
当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; }