[Codeforces #368 (Div. 2) Pythagorean Triples] 數學:勾股數


[Codeforces #368 (Div. 2) Pythagorean Triples] 數學:勾股數

題目鏈接: [Codeforces #368 (Div. 2) Pythagorean Triples]
題意描述:給定直角三角形的一條邊,求出直角三角形的另外兩條邊。
解題思路
這個題目完全就是對數學知識的考察了。
首先,下面從百度百科上摳來的,”勾股數“。

什么是勾股數?:凡是可以構成一個直角三角形三邊的一組正整數,稱之為勾股數。
勾股數的性質:任何一個勾股數組(a,b,c)內的三個數同時乘以一個整數n得到的新數組(na,nb,nc)仍然是勾股數,所以一般我們想找的是a,b,c互質的勾股數組。
a,b,c互質的勾股數組的方法
(1)當a為大於1的奇數2n+1時,b=2n^2+2n, c=2n^2+2n+1。
實際上就是把a的平方數拆成兩個連續自然數,例如:
n=1時(a,b,c)=(3,4,5)
n=2時(a,b,c)=(5,12,13)
n=3時(a,b,c)=(7,24,25)[1]
… …
而且由於兩個連續自然數必然互質,所以用這個方法得到的勾股數組全部都是互質的。
(2)當a為大於等於4(注意:百度百科這個地方錯了… )的偶數2n時,b=n^2-1, c=n^2+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)[1]
… …
當n為奇數時由於(a,b,c)是三個偶數,所以該勾股數組必然不是互質的;而n為偶數時由於b、c是兩個連續奇數必然互質,所以該勾股數組互質。
所以如果你只想得到互質的數組,這條可以改成,對於a=4n (n>=2), b=4n²-1, c=4n²+1,例如:
n=2時(a,b,c)=(8,15,17)
n=3時(a,b,c)=(12,35,37)
n=4時(a,b,c)=(16,63,65)[1]
… …

#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

//#pragma comment(linker, "/STACK:1024000000,1024000000")

#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define fst first
#define snd second

typedef __int64 LL;
typedef unsigned __int64 ULL;
//typedef long long LL;
typedef pair<int, int> PII;

const int INF = 0x3f3f3f3f;
const int MAXN = 1000 + 5;

ULL N, M, K, X;
int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif // ONLINE_JUDGE
    while (~scanf ("%I64u", &N) ) {
        X = N >> 1;
        if (N & 1) {
            if (N <= 1) {
                printf ("-1\n");
                continue;
            }
            M = ( (X * X + X) << 1);
            K = ( (X * X + X) << 1) | 1;
        } else {
            if (N < 4) {
                printf ("-1\n");
                continue;
            }
            M = X * X - 1;
            K = X * X + 1;
        }
        printf ("%I64u %I64u\n", M, K);
    }
    return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com