勾股数组

设三元组(a,b,c)满足a^2 + b^2 = c^2的勾股数组,那么是否存在无穷多个勾股数组呢,

答案是肯定的,将三元组乘以d,可以得到新的三元组(da,db,dc) 即(da)^2 + (db)^2 = (dc)^2 --> (a^2+b^2) * d^2 =c^2 * d^2

d的取值是任意的,所以存在多个勾股数组

本源勾股数组

本源勾股数组是一个三元组(a,b,c),其中a,b,c只存在公因数1,且满足a^2 + b^2 = c^2

积累数据:下面的一些本源勾股数组

 (3,4,5), (5,12,13) ,(8,15,17),(7,24,25)

 (20,21,29),(9,40,41),(12,35,37),(11,60,61)

分析数据:

由这些数据可以推断出可能存在一个结论,即a,b的奇偶性不同,且c总是奇数

证明:如果a,b都是偶数,那么c肯定也是偶数,那么a,b,c存在公因子2,所以三元组不是本源的

  如果a,b都是奇数, 那么c必然是偶数。 设a=2*x+1, b=2*y+1,c=2*z将其带入a^2 + b^2 = c^2

  得到(2x+1)^2 + (2y+1)^2 = (2z)^2 --> 4x^2+4x+4y^2+4y+2=4z^2 -->  2x^2+2x+2y^2+2y+1=2z^2

  式子的左边是一个奇数,而右边是偶数,所以上述假设不成立

  所以a,b一个是偶数,一个是奇数,从而c是奇数

  

怎么快速得到一定范围内的本源勾股数组

(a,b,c)是本源勾股数组, 且a是奇数 ,b是偶数,c是奇数,那么可以进行因式分解,

a^2 = c^2 - b^2 = (c-b)(c+b)

3^2 = (5-4)(5+4) = 1 * 9

15^2 = (17-8)(17+8) = 9 * 25

32^2 = (37-12)(37+12) = 25 * 49

好像c-b与c+b总是平方数,

证明:假设(c-b)%d==0 && (c+b)%d==0, 那么根据模的性质,有(c+b)+(c-b) = 2c, 2c%d==0, 且(c+b)-(c-b)=2b,2b%d==0,

  即d整除2b和2c, 因为b和c没有公因数,所以d只能是1或者2, 由(c+b)(c-b)=a^2 也是d的倍数,且a是奇数,所以a^2是奇数,所以d只能取值1

  所以(c-b)与(c+b)互素,且(c-b)(c+b)=a^2, 即(c-b)与(c+b)的和是平方数,这种情况只有在(c-b)与(c+b)本身都是平方数的时候才出现

如图:

  

因为(c-b)与(c+b)互素,所以pi 与qi肯定是不相同的,但是(c-b)(c+b)=a^2, 所以指数ai ,bi肯定是偶数的,所以(c+b) 和 (c-b)本身都是平方数

  设c+b=s^2,c-b=t^2, 其中s>t>=1是没有公因数的奇数

  解方程得 

uva106

给我们一定n,要我们求1->n内有多少个本源勾股数组, 和多少个不属于勾股数组的数字

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
typedef long long LL;
const int INF = <<;
/* */
bool vis[ + ];
int ans1[ + ];
int gcd(int a, int b)
{
if (b == )
return a;
return gcd(b, a%b);
}
int main()
{
int s, t, a, b, c;
int cnt = , n;
while (scanf("%d", &n) != EOF)
{
cnt = ;
memset(ans1, , sizeof(ans1));
memset(vis, , sizeof(vis));
int m = sqrt(*n);
for (s = ; s <= m; s += )
{
for (t = ; t < s; t += )
{
if (gcd(s, t) != ) continue;
a = s * t;
b = (s*s - t*t) / ;
c = (s*s + t*t) / ;
if (c>n) break;
if ((LL)a*a + (LL)b*b == (LL)c*c)
{
//printf("%d %d %d\n", a, b, c);
ans1[c]++;
for (int i = a, j = b, k = c; k <= n; i += a, j += b, k += c)
vis[i] = vis[j] = vis[k] = true;
}
else if ((LL)a*a + (LL)b*b < (LL)c*c)
break;
}
} for (int i = ; i <= n; ++i)
{
ans1[i] += ans1[i - ];
if (!vis[i])
cnt++;
}
printf("%d %d\n", ans1[n], cnt);
}
return ;
}

勾股数组及其应用uva106的更多相关文章

  1. URAL 2032 - Conspiracy Theory and Rebranding【本源勾股数组】

    [题意] 给出三角形的三个边长,均是10^7以内的整数,问三角形的三个角的坐标是否能均是整数,输出其中任意一个解. [题解] 一开始想的是枚举一条边的横坐标,然后通过勾股定理以及算角度求出其他点的坐标 ...

  2. 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 ...

  3. 毕达哥拉斯三元组(勾股数组)poj1305

    本原毕达哥拉斯三元组是由三个正整数x,y,z组成,且gcd(x,y,z)=1,x*x+y*y=z*z 对于所有的本原毕达哥拉斯三元组(a,b,c) (a*a+b*b=c*c,a与b必定奇偶互异,且c为 ...

  4. bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Stat ...

  5. hdu 3939(勾股+容斥)

    题意: 给定一个整数L(L<=1e12),计算(x,y,z)组的个数.其中x<y<z,x^2+y^2=z^2,gcd(x,y)==1,gcd(x,z)==1,gcd(y,z)==1. ...

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

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  7. 【bzoj1041】圆上的整点

    题意 给定一个圆\(x^2+y^2=z^2\),求圆周上有多少个点的坐标是整数. \(r\leq 2*10^9\) 分析 这道题目关键要知道一些勾股数的性质,剩下的就很好处理了. 勾股数的性质 参考: ...

  8. ACM 数论小结 2014-08-27 20:36 43人阅读 评论(0) 收藏

    断断续续的学习数论已经有一段时间了,学得也很杂,现在进行一些简单的回顾和总结. 学过的东西不能忘啊... 1.本原勾股数: 概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b ...

  9. Erlang入门(五)——补遗

    暂时搞不到<Programming Erlang>,最近就一直在看Erlang自带的例子和Reference Manual.基础语法方面有一些过去遗漏或者没有注意的,断断续续仅记于此. 1 ...

随机推荐

  1. A Very Easy Triangle Counting Game

    题意:在圆上取n个点,相邻两个点之间连线,(注意,n和1相邻),然后所有点对(i ,i+2)相连,问能形成的不同的三角形有多少个? 思路:找规律 n=3,cnt=1; n=4,cnt=8; n=5 c ...

  2. uva 357 Let Me Count The Ways(01背包)

    题目连接:357 - Let Me Count The Ways 题目大意:有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 解题思路:和uva674是一 ...

  3. 与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏

    原文:与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏 [索引页][源码下载] 与众不同 wind ...

  4. 网络知识汇总(2) - Linux下如何修改ip地址

    在Linux的系统下如何才能修改IP信息   以前总是用ifconfig修改,重启后总是得重做.如果修改配置文件,就不用那么麻烦了-   A.修改ip地址   即时生效:   # ifconfig e ...

  5. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  6. Dvtm -- 平铺式终端

    Dvtm -- 平铺式终端_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休! Dvtm -- 平铺式终端 关注我们: 如果你使用过 Dwn 或 Awesome 这种平铺式窗口管理器,一定 ...

  7. POJ 3414 Pots 记录路径的广搜

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  8. linux通过使用mail发送电子邮件

    通过外部方法发送的电子邮件 bin/mail默认为本地sendmail发送电子邮件,求本地的机器必须安装和启动Sendmail服务.配置很麻烦,并且会带来不必要的 资源占用.而通过改动配置文件能够使用 ...

  9. hdu 3309 Roll The Cube ( bfs )

    Roll The Cube Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  10. .idata数据的解析

    每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...