POJ1305 Fermat vs. Pythagoras【毕达哥拉斯三元组】

题目链接:

http://poj.org/problem?id=1305

题目大意:

给一个整数N,求N范围内的本原的毕达哥拉斯三元组的个数,以及N以内毕达哥拉斯三元组不涉及

数的个数。

思路:

本原毕达哥拉斯三元组x^2 + y^2 = z^2 满足 x = m^2 - n^2,y = 2*m*n,z = m^2 + n^2,其

中m > n,且若m为奇数,则n为偶数,若m为偶数,则n为奇数。要求所给范围N内的本原毕达哥拉

斯三元数组,只需枚举m、n,然后将三元组x、y、z乘以i(保证i*z在所给范围内,因为z>x且z>y),

就可以求出所有的毕达哥拉斯三元组。

注意:因为在n范围内,所以z < n,即m^2 + n^2 < N。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool flag[1000010];

int GCD(int a,int b)
{
    if(b == 0)
        return a;
    return GCD(b,a%b);
}

int main()
{
    int N;
    while(cin >> N)
    {
        int temp,m,n,ans1,ans2,x,y,z;
        ans1 = ans2 = 0;
        memset(flag,false,sizeof(flag));
        temp = sqrt(N*1.0);
        for(int n = 1; n <= temp; ++n)
        {
            for(int m = n+1; m <= temp; ++m)
            {
                if(m*m + n*n > N)
                    break;
                if((n&1) != (m&1))
                {
                    if(GCD(m,n) == 1)
                    {
                        x = m*m - n*n;
                        y = 2*m*n;
                        z = m*m + n*n;
                        ans1++;
                        int i;
                        for(i = 1; ; ++i)
                        {
                            if(i*z > N)
                                break;
                            flag[i*x] = true;
                            flag[i*y] = true;
                            flag[i*z] = true;
                        }
                    }
                }
            }
        }
        for(int i = 1; i <= N; ++i)
            if(!flag[i])
                ans2++;

        cout << ans1 << ' ' << ans2 << endl;
    }

    return 0;
}
时间: 2024-08-08 05:36:58

POJ1305 Fermat vs. Pythagoras【毕达哥拉斯三元组】的相关文章

POJ 1305-Fermat vs. Pythagoras(毕达哥拉斯三元组的解)

题目地址:POJ 1305 题意:给一个整数N,求N范围内的本原的毕达哥拉斯三元组的个数,以及N以内毕达哥拉斯三元组不涉及数的个数. 思路: 首先我们先来了解一下一些基本的定义 毕达哥拉斯三元组: 设不定方程:x^2+y^2=z^2若正整数三元组(x,y,z)满足上述方程,则称为毕达哥拉斯三元组. 本原毕格拉斯三元组: 在毕格拉斯三元组的基础上,若gcd(x,y,z)=1,则称为本原的毕达哥拉斯三元组. 定理: 正整数x,y,z构成一个本原的毕达哥拉斯三元组且y为偶数,当且仅当存在互素的正整数m

Fermat vs. Pythagoras POJ - 1305 (数论之勾股数组(毕达哥拉斯三元组))

题意:(a, b, c)为a2+b2=c2的一个解,那么求gcd(a, b, c)=1的组数,并且a<b<c<=n,和不为解中所含数字的个数,比如在n等于10时,为1, 2, 7,9则输出4. 好了!把所用知识点说一下: 数论之勾股数组(毕达哥拉斯三元组) 本原勾股数组(a,b,c)(a为奇数,b偶数)都可由如下公式得出:a=st,b=(s2-t2)/2, c = (s2+t2)/2, 其中s>t>=1是没有公因数的奇数. 再把勾股数公式拿过来: 套路一: 当a为大于1的奇数

数论(毕达哥拉斯定理):POJ 1305 Fermat vs. Pythagoras

Fermat vs. Pythagoras Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 1493   Accepted: 865 Description Computer generated and assisted proofs and verification occupy a small niche in the realm of Computer Science. The first proof of the

UVa 106 - Fermat vs Pythagoras(数论题目)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=42  Fermat vs. Pythagoras  Background Computer generated and assisted proofs and verification occupy a small niche in the realm

FZU1669 Right-angled Triangle【毕达哥拉斯三元组】

题目链接: http://acm.fzu.edu.cn/problem.php?pid=1669 题目大意: 求满足以a.b为直角边,c为斜边,并且满足a + b + c <= L的直角三角形的个数. 思路: 勾股定理,a.b.c也就是本原毕达哥拉斯三元组,则满足: x = m^2 - n^2 y = 2*m*n z = m^2 + n^2 其中m > n,且若m为奇数,则n为偶数,若m为偶数,则n为奇数. 枚举m.n,然后将三元组乘以i倍,保证 i * (x + y + z)在所给范围内(2

Python练习题 037:Project Euler 009:毕达哥拉斯三元组之乘积

本题来自 Project Euler 第9题:https://projecteuler.net/problem=9 # Project Euler: Problem 9: Special Pythagorean triplet # A Pythagorean triplet is a set of three natural numbers, # a < b < c, for which, a**2 + b**2 = c**2 # For example, 3**2 + 4**2 = 9 +

UVA106 - Fermat vs. Pythagoras(素勾股数)

题目链接 题目大意:给你一个数n,勾股数三元组(x,y,z)的定义:满足x < y < z, x^2 + y^2 = z^2.现在问这里里面有多少个三元组是素勾股数即满足x,y, z两两互质.并且判断剩下的1-n的数有多少是没有出现在勾股数三元组中. 解题思路:先找出所有的素勾股数(x, y, z) ,那么便可以通过(kx, ky, kz)得到不是素勾股数的勾股数.接着要换种方式构造素勾股数,公式:x = m^2 - n^2; y = 2?m?n; z = m^2 + n^2:其中若 m 和

UVa 106 - Fermat vs. Pythagoras

题目:找到小于N的勾股数组的朴素解(三个数互质),并找到[1, N]中所有勾股数组中未出现过的数字个数. 分析:数论.这里直接利用<原本>中的解法即可. x = 2st,y = s^2 - t^2,z = s^2 + t^2, 其中:1.s > t:(枚举顺序) 2.s和t互质:(朴素解) 3.s和t奇偶性不同:(反证法证明) 在计算未出现的数字时,需要枚举朴素解的倍数. 说明:伟大的欧几里得╮(╯▽╰)╭. #include <cstring> #include <c

毕达哥拉斯三元组的解

对于一个方程: x^2 + y^2 = z^2,他两两互质的正整数解满足一下条件 1. x = 2*m*n ,y = m^2 - n^2 ,z = m^2 + n^2 2. gcd( m , n) =1, m > n , m 与 n 的奇偶性不同 ( 2*m*n )^2 + ( m^2 - n^2 )^2 = ( m^2 + n^2 )显然成立. 下面我们来看一个例题 POJ 1305 传送门 题意: 给定一个n,然后求满足上面那个方程的解的个数以及不满足勾股数的个数. 分析: 题目的数据范围比