POJ 1305 Fermat vs. Pythagoras

来源:互联网 发布:北京seo服务价格 编辑:程序博客网 时间:2024/05/16 07:51

大意:给定一个整数N,求N范围内(x,y,z <= n)本原的毕达哥拉斯三元组的个数,以及N以内且毕达哥拉斯三元组不涉及的数的个数。

思路:

本原毕达哥拉斯方程组满足:

x = m^2 - n^2;

y = 2*m*n;

z = m^2 + n^2;

其中m > n,且m,n奇偶性不同。

在此题中,要求所给范围内的毕达哥拉斯三元组,只需对m,n进行枚举即可,然后将三元组乘以i(保证i*z在所给的范围之内),就可以求出所有的毕达哥拉斯三元组。

#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int MAXN = 1000010;int vis[MAXN];int gcd(int a, int b){return b == 0? a:gcd(b, a%b);}int n;void init(){memset(vis, 0, sizeof(vis));}void solve(int n){init();int x, y, z;int m = (int)sqrt(n+0.5);int ans1 = 0, ans2 = 0;for(int i = 1; i <= m; i++){for(int j = i+1; j <= m; j++) if(i % 2 != j % 2){if(i*i + j*j > n) break;if(gcd(i, j) == 1){x = j*j - i*i;y = 2*i*j;z = j*j + i*i;ans1++;for(int t = 1; ; t++){if(t*z > n) break;vis[t*x] = vis[t*y] = vis[t*z] = 1;}}}}for(int i = 1; i <= n; i++) if(!vis[i]) ans2++;printf("%d %d\n", ans1, ans2);}int main(){while(~scanf("%d", &n)){solve(n);}return 0;}


原创粉丝点击