UVa 106 - Fermat vs. Pythagoras

传送门

UVa 106 - Fermat vs. Pythagoras

思路

继续学习。

参考了程序控的题解

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 1e6 + 100;
const int INF = 0x3f3f3f3f;
 
int vis[MAXN];
 
int GCD(int a, int b)
{
    return b == 0 ? a : GCD(b, a % b);
}
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int fcnt, scnt, i, j, n, x, y, z;
    while (~scanf("%d", &n))
    {
        memset(vis, 0, sizeof vis);
        fcnt = scnt = 0;
        int imax = (int)sqrt((double)n + 0.5);
        for (i = 1; i <= imax; i++)
        {
            for (j = i + 1; j <= imax; j += 2)
            {
                if (GCD(i, j) != 1)
                    continue;
                z = i * i + j * j;
                if (z > n)
                    break;
                x = 2 * i * j;
                y = j * j - i * i;
                fcnt++;
                for (int k = 1; z * k <= n; k++)
                    vis[k * x] = vis[k * y] = vis[k * z] = 1;
            }
        }
        for (i = 1; i <= n; i++)
            if (!vis[i])
                scnt++;
        printf("%d %d\n", fcnt, scnt);
    }
    return 0;
}

Powered by Jekyll and Theme by solid