題目連接: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; }