POJ-1305(勾股定理)(Fermat vs. Pythagoras)

原创 2012年03月29日 13:04:11
这个题目就是找在1~N之间互质的三个正整数x、y、z,并满足x^2+y^2=z^2,判断这样的数有多少对,以及跟1~N中与这些互质正整数无关的正整数的个数。
其实比较关键的是对上面那个式子 x^2+y^2=z^2 进行变形,减少一个变量为
(r^2-s^2)^2 + (2*r*s)^2 = (r^2+s^2)^2,
这样只有两个变量存在,可以减少一轮循环。于是题目就变成了找这样的r和s,当r*r + s*s <= n时,
z = r*r + s*s;
 y = max(r*r - s*s, 2*r*s);
 x = min(r*r - s*s, 2*r*s);

 此时,如果x、y、z互质,满足条件的正整数组计数就加1,同时把所有与这些数相关的数组位标记为1

#define MAXN 1000000
int flag[MAXN + 5];
int ans;
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}
void process(int value)
{
    int i, j;
    for (j = 1; j * j <= value; ++j) {
        int minj = j - 1;//MY_MIN(sqrt(value * 1.0 - j * j) + 1, j - 1);
        for (i = 1; i <= minj; ++i) {
            if (gcd(i, j) == 1) {
                int x = j * j - i * i;
				if (x <= 0) break;
                int y = 2 * i * j;
                int z = j * j + i * i;
                if (x <= value && y <= value && z <= value) {
                    if (gcd(gcd(x, y), z) == 1)
                        ++ans;
                }
                else
                    break;
                int times = 1;
                while (x * times <= value && y * times <= value && z * times <= value) {
                    flag[x * times] = flag[y * times] = flag[z * times] = 1;
                    ++times;
                }
            }
        }
    }
}
int main()
{
    int n;
    while (cin>>n) {
        ans = 0;
        memset(flag, 0, sizeof(flag));
        int i;
        int sum = 0;
        process(n);
        for (i = 0; i <= n; ++i)
            if (flag[i])
                ++sum;
        printf("%d %d\n", ans, n - sum);
    }
    return 0;
}


MATLAB学习笔记(二)

本节主要介绍MATLAB预定义函数,包括一般数学函数(指数,对数,根),近似函数,离散数学函数(因数函数,素数函数),三角函数(标准三角函数,反三角函数,双曲三角函数),数据分析函数(最大值和最小值,...
  • bcj296050240
  • bcj296050240
  • 2015年05月15日 16:24
  • 1121

JS学习第二天----JS语言核心

JS语言核心     有些东西,对于初学者来说,可能看不懂,我在这里只是想说一下,JS里面有这么个情况,并不是说让你掌握,你只需要大致浏览一下就可以了. // 所有在双斜杠之后的内容都属于注释...
  • shanyongxu
  • shanyongxu
  • 2015年08月04日 19:33
  • 3317

《LaTex入门》第一章例子(带注释)

《LaTex入门》第一章例子(带注释)
  • qazxswed807
  • qazxswed807
  • 2015年05月10日 13:04
  • 3090

POJ1305(Fermat vs. Pythagoras 毕达哥拉斯三元组解不定方程)

Fermat vs. Pythagoras Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 1...
  • u013021513
  • u013021513
  • 2015年08月05日 18:00
  • 555

POJ 1305 Fermat vs. Pythagoras

题意:求n内本原毕达哥拉斯三元组的组数,以及n内没有被毕达哥拉斯数涉及到数的个数。 名词解释:        毕达哥拉斯三元组:又名勾股定理       本原的毕达哥拉斯三元组:指如果一个毕达哥...
  • niuxiunan
  • niuxiunan
  • 2013年07月11日 17:52
  • 628

poj1305 Fermat vs. Pythagoras----勾股数

Fermat vs. Pythagoras Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 1...
  • qiqijianglu
  • qiqijianglu
  • 2012年08月12日 14:50
  • 1047

POJ1305 UVA106 Fermat vs. Pythagoras 毕达哥斯拉三元组 特殊的不定方程

特殊不定方程的应用,跟普通的不定方程一样,还是要依靠扩展欧几里德来解决,,可能方程有点偏, 题意,给一个正数N,求小于等于正数N的树中,本原的毕达哥斯拉三元组的个数  和  毕达哥斯拉三元组不涉及N以...
  • u010682557
  • u010682557
  • 2014年03月17日 20:28
  • 947

UVa 106/POJ 1305 Fermat vs. Pythagoras(数论&勾股数)

对所有满足3≤s≤√(2n-1),1≤t≤max{ s-2 , √(2n-s^2) },gcd(s,t)=1的奇数s,t,求PPT和对应范围内的派生勾股数(本原勾股数组(a,b,c)的派生勾股数组为(...
  • synapse7
  • synapse7
  • 2013年08月07日 18:37
  • 1317

POJ 1305-Fermat vs. Pythagoras(本原的毕达哥拉斯三元组+枚举)

Fermat vs. Pythagoras Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 1...
  • MIKASA3
  • MIKASA3
  • 2016年08月04日 08:33
  • 484

POJ 1305 Fermat vs. Pythagoras [本源毕达哥拉斯不等式]【数论】

题目链接:http://poj.org/problem?id=1305 ——————————-. Fermat vs. Pythagoras Time Limit: 2000MS Me...
  • qq_33184171
  • qq_33184171
  • 2016年09月21日 21:39
  • 165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-1305(勾股定理)(Fermat vs. Pythagoras)
举报原因:
原因补充:

(最多只允许输入30个字)