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 和 n 是互质,而且 m 和 n 其中有一个是偶数,计算出来的 x, y, z就是素勾股数。这样可以将遍历的范围缩小1000.

代码:

#include <cstdio>
#include <cstring>
#include <cmath>

const int maxn = 1e6 + 5;

int vis[maxn];
int n;

int gcd(int a, int b) {

    return b == 0 ? a : gcd(b, a % b);
}

int solve () {

    int x, y, z;
    int m = sqrt(n);
    int count = 0;
    memset (vis, 0, sizeof (vis));

    for (int i = 1; i <= m; i++) {
        for (int j = i + 1; j <= m; j += 2) {
            x = j * j - i * i;
            y = 2 * i * j;
            z = j * j + i * i;
            if (x > n || y > n || z > n)
                continue;
            if (x * x + y * y == z * z && gcd(i, j) == 1) {

    //            printf ("%d %d %d\n", x, y, z);
                count++;
                for (int k = 1; k * z <= n; k++)
                    vis[k * x] = vis[k * y] = vis[k * z] = 1;
            }
        }
    }

    return count;
}

int main () {

    while (scanf ("%d", &n) == 1) {

        int c = solve();
        int p = 0;
        for (int i = 1; i <= n; i++)
            if (!vis[i]) {
                p++;
//                printf ("%d\n", i);
            }
        printf ("%d %d\n", c, p);
    }
    return 0;
}
时间: 2024-08-27 19:11:54

UVA106 - Fermat vs. Pythagoras(素勾股数)的相关文章

迅雷笔试题_素勾股数的个数

题目: 勾股数,是由三个正整数组成的数组:能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整数解.如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数.如果 (a, b, c) 互质,它们就称为素勾股数.给定正整数N, 计算出小于或等于N的素勾股数个数. 样例输入: 10 样例输入: 1 思路: 产生素勾股数的方式: 设m > n .m 和n 均是正整数, a=m2-n2 b=2mn c= m2+n2 若m 和n 是互质,而且m 和n 其中有一个是偶数,计算

Uva 106-Fermat vs. Pythagoras(勾股数性质)

题目链接:点击打开链接 题意:给出N,x^2+y^2=z^2 小于等于N的解(互素)的个数以及小于N的个数除掉所有解(包括不互素)已经用掉的数. 度娘给出勾股数的定义:只考虑互素的解,给出勾股数公式 a=2*m*n ,b=m*m-n*n ,c=m*m+n*n;  枚举m,n ,复杂度 O(log(N)^2) #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib&g

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

关于勾股数的规律

有可能是初中写的最后一篇了,中考啊~~以前跟一些人提到过,互质的勾股数a,b,c(即a²+b²=c²)都满足一个规律(其实互质满足了,那么不互质也一定满足):当a为奇数时:b=(a²-1)/2c=(a²+1)/2当a为偶数时:b=a²/4-1c=a²/4+1那么,这个条件是否充分呢(就是说当a,b,c满足以上规律时,这三个数是否为互质的勾股数)?显而易见,如果不要求互质的话,这是绝对满足的,证明如下:当a为奇数时:a²+b²=a²+[(a²-1)/2]²=a²+(a²-1)²/4=a²+(a^4

勾股数---Python

传说存在唯一一组勾股数,三个数的和是1000,那么它的积是多少呢? def judge(a,b,c):    if a+b<=c or b+c<=a or a+c<=b:        return 0    if a*a+b*b==c*c or b*b+c*c==a*a or a*a+c*c==b*b:        return 1    result=0for i in range(1,1000):    for j in range(1,1000-i):        k=100

勾股数

程序地址:http://www.cheemoedu.com/exercise/16 问题描述: 所谓勾股数,一般是指能够构成直角三角形3条边的3个正整数(a,b,c).即a2+b2=c2,a,b,cΣN求1000以内的勾股数. 我的思路:使用for循环列出所有的数,连续判断是否满足a2+b2=c2关系,满足的就是勾股数,但是要注意,三个数中任意一个都不可以为0,且重复的如3,4,5和4,3,5要去除,只留下其中一个: 我的代码: for i in range(1,1000):     for j

HDU 6441 费马大定理+勾股数

#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second #define all(a) (a).begin(), (a).end() #define fillchar(a, x) memset(a, x, sizeof(a)) #define huan printf("\n") #define debug(a,b) cout<