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;
}



你可能感兴趣的:(uva 106 Fermat vs. Pythagoras)