2011年5月14日 星期六

ACM 106 Fermat vs. Pythagoras



http://zh.wikipedia.org/zh-tw/%E5%8B%BE%E8%82%A1%E6%95%B8
#include <stdio.h>
#include <stdbool.h>

int gcd(int m, int n)
{
    if (n == 0)
        return m;
    return gcd(n, m%n);
}

int main(void)
{
    int b, c, m, n, N, triple;
    bool flag[1000001];
   
    while (scanf("%d", &N) == 1)
    {
        for (c = 1; c <= N; c++)
            flag[c] = false;
        triple = 0;
        for (n = 1; n < 1000; n++)
            for (m = n+1; (c=m*m+n*n) <= N; m+=2)
            {
                if (gcd(m, n) != 1)
                    continue;
                triple++;
                for (b = 1; b*c <= N; b++)
                    flag[b*(m*m-n*n)] = flag[b*(2*m*n)] = flag[b*c] = true;       
            }
        for (c = 0, b = 1; b <= N; b++)
            if (!flag[b])
                c++;
        printf("%d %d\n", triple, c);
    }
   
    return 0;
}

沒有留言:

張貼留言