链接http://codeforces.com/problemset/problem/707/C
思路
若输入为1,2 返回0
若输入为奇数
若需要一组最小数为奇数的勾股数,可任意选取一个 3 或以上的奇数,将该数自乘为平方数,除以 2,答案加减 0.5 可得到两个新的数字,这两个数字连同一开始选取的奇数,三者必定形成一组勾股数。但却不一定是以这个选取数字为起首勾股数的唯一可能,例如 (27, 364, 365) 并非是以 27 为起首的唯一勾股数,因为存在另一个勾股数是 (27, 36, 45),同样也以 27 为首.
若输入为偶数
以下的方法可用来找出勾股数。设 m > n 、 m 和 n 均是正整数,
a=m^2-n^2
b=2mn
c=m^2+n^2
令n=1, m=b/2
a=m^2-1
b=m^2+1
#include<stdio.h>
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
int main(){
ll n;
cin>>n;
if(n<=2){
printf("-1\n");
return 0;
}
if(n&1&&n>2){
ll a=(n*n-1)/2;
ll b=a+1;
printf("%I64d %I64d\n",a,b);
}
else if(!(n&1)&&n>2)
{
n/=2;
ll a=n*n-1;
ll b=n*n+1;
printf("%I64d %I64d\n",a,b);
}
return 0;
}