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,n(m>n),其中m,n的奇偶性不同,并且满足x=m^2-n^2,y=2*m*n, z=m^2+n^2

所以根据定理,对于本题只要枚举一下m,n(m,n<=sqrt(n)),然后将三元组乘以i(保证i*z小于N),就可以求出所有的毕达哥拉斯三元组。

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

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64 LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e6+10;
int vis[Maxn];
int gcd(int a,int b)
{
    while(b!=0){
        int r=b;
        b=a%b;
        a=r;
    }
    return a;
}
int main()
{
    int N;
    while(~scanf("%d",&N)){
        int cnt1=0;
        int cnt2=0;
        memset(vis,0,sizeof(vis));
        int t=(int)sqrt(N*1.0);
        for(int n=1;n<=t;n++){
            for(int m=n+1;m<=t;m++){
                if(n*n+m*m>N) break;
                if((n&1)!=(m&1)){
                    if(gcd(n,m)==1){
                        int x=m*m-n*n;
                        int y=2*m*n;
                        int z=m*m+n*n;
                        cnt1++;
                        for(int i=1;;i++){
                            if(i*z>N) break;
                            vis[x*i]=1;
                            vis[y*i]=1;
                            vis[z*i]=1;
                        }
                    }
                }
            }
        }
        for(int i=1;i<=N;i++){
            if(!vis[i]) cnt2++;
        }
        printf("%d %d\n",cnt1,cnt2);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 16:03:58

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

数论(毕达哥拉斯定理):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

毕达哥拉斯三元组的解

对于一个方程: 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,然后求满足上面那个方程的解的个数以及不满足勾股数的个数. 分析: 题目的数据范围比

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的奇数

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在

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

poj 1305

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

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 +

poj 3990 Fermat Point in Quadrangle 凸包和费马点

题意: 求一个四边形的费马点. 分析: 模拟退火要么超时要么wa,这题的数据就是不想让随机算法过的..其实四边形的费马点很简单,如果是凸四边形的话费马点是对角线交点,如果是凹四边形费马点是凹点.但题目给的四个点顺序是不确定的,所以要先求下凸包. 代码: //poj 3990 //sep9 #include <iostream> #include <cmath> #include <algorithm> using namespace std; struct Point