uva 106 Fermat vs. Pythagoras

素勾股數定理

如果m,n互質且其中一個是偶數

那麼 a = m*m - n*n

        b = 2*m*n

       c = m*m +n * n

(a,b,c)就是素勾股數。

所有的勾股數可以表示爲(na,nb,nc)。

#include <iostream>
#include<cstring>
#include<stdio.h>
#include<cmath>
using namespace std;
int vis[1000010];

int gcd(int a,int b)
{
    return b == 0?a:gcd(b,a%b);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof vis);
        int m = sqrt(n+0.5);
        int ans = 0;
        int p = 0;
        long long a,b,c;
        for(long long i = 1; i <= m; i++) //因爲每個數要小於n,b = 2*i*j所以i<=sqrt(n)
        {
            for(long long j = i + 1;; j+=2)//兩個數保證有且只有一個偶數
            {
                long long tmp = i*i+j*j;
                if(tmp > n) break;
                if(gcd(i,j)==1)
                {
                    ans++;
                    a = j*j - i*i;
                    b = 2*i*j;
                    c = j*j + i*i;
                    if(!vis[a]){p++;vis[a] = 1;}
                    if(!vis[b]){ p++;vis[b] = 1; }
                    if(!vis[c]){  p++; vis[c] = 1; }
                    for(long long i = 2; i*c <= n; i++)
                    {
                         if(!vis[a*i]){p++;vis[a*i] = 1;}
                         if(!vis[b*i]){p++;vis[b*i] = 1;}
                         if(!vis[c*i]){p++;vis[c*i] = 1;}
                    }
                }
            }
        }
        printf("%d %d\n",ans,n - p);
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章