勾股数组 学习笔记

颓废了一个暑假,想做点CF提高一下智商,然后就被这题卡住了。    http://codeforces.com/contest/707/problem/C

题目大意是给出各条边都是正整数的直角三角形的一条边长,求另外两条边可能的一种方案。 除了爆搜脑子一片空白,然后就很没志气的看了题解,提到了勾股数组,于是学习了一下.网络上的资料感觉证明不是详细,所以自己来写个总结。



1.首先如果 $a^2+b^2=c^2$ , 则$(ka)^2+(kb)^2=(kc)^2$ , 因此我们先只考虑$gcd(a,b,c)=1$的情况.

2.$a$和$b$必定一个是奇数一个是偶数.

反证: 如果a,b都是偶数,那么c也为偶数,则$gcd(a,b,c)$不可能为1.  如果a,b都是奇数,那么c为偶数.   $a^2+b^2 \equiv\ 2 (mod\ 4)$. 而$c^2 \equiv\ 0 (mod\ 4)$ .

3.不妨设$a$为偶数,那么$b$,$c$都是奇数。  设$a=2mn$ $(m>n)$. 下面证明$(a,b,c)$可以表示为$(2mn,m^2-n^2,m^2+n^2)$的形式。  反解$m,n$可以得到

$m=\sqrt{\frac{b+a}{2}}$    $n=\sqrt{\frac{c-b}{2}}$ .

只需证明$\sqrt{\frac{b+a}{2}}$和$\sqrt{\frac{b-a}{2}}$都是正整数,即证明$\frac{b+a}{2}$和$\frac{b+a}{2}$都是完全平方数。

$a^2=c^2-b^2=(c-b)*(c+b)$.

先证明$gcd(c-b,c+b)=2$ :

$$d|c+b,d|c-b\ \to\ \ d|2b,d|2c\ \ \to\ \ d|gcd(2b,2c)\ \ \to\ \ d|2gcd(b,c)\ \ \to\ \ gcd(c+b,c-b)|2$$

而$b$,$c$均为偶数,那么$c-b$,$c+b$也都是偶数,那么$gcd(c-b,c+b)$只能是2.  所以有$gcd(\frac{c-b}{2},\frac{c+b}{2})=1$

因为$(\frac{a}{2})^2=\frac{c-b}{2}*\frac{c-b}{2}$  且$gcd(\frac{c-b}{2},\frac{c+b}{2})=1$,所以$\frac{c-b}{2}$和$\frac{c+b}{2}$都是完全平方数。

故$(a,b,c)$可以表示为$(2mn,m^2-n^2,m^2+n^2)$的形式,只需取$m=\sqrt{\frac{b+a}{2}}$    $n=\sqrt{\frac{c-b}{2}}$ .

这就给出了构造勾股数组的一个公式,因为$(m,n)$和$(a,b,c)$存在一一对应的关系。 同理$(km,kn)$和$(ka,kb,kc)$也对应,因此这个公式也适用于$gcd(a,b,c)>1$的情况。



再回到最开始的CF的那道题。

1.如果一开始给的数<=2,那么肯定无解,因为不存在一个勾股数组里面有元素<3.

证明:不妨设$a<=b<c$, 因为$a^2=(c-b)*(c+b)$    $(c+b)-(c-b)=2b>=2$  如果$a<=2$ 那么$a^2=(c-b)*(c+b)<=4$  容易检验无解。

2.如果一开始给了一个偶数$a$,那么$a=2mn$ 令$n=1,m=\frac{a}{2}$即可构造出一组$(a,b,c)$.

3.如果一开始给了一个奇数$b$,那么$b=m^2-n^2=(m+n)*(m-n)$ 令$m-n=1,m+n=b$ 解出$m$和$n$ 就可以得到一组$a$和$c$了.

ps:构造方法有很多,可以百度一下,这只是我自己想到的一种。



bonus:如果把上面那题升级成求方案数该怎么办?

1.如果一开始给的数<=2,那么肯定无解,因为不存在一个勾股数组里面有元素<3.

2.如果一开始给了一个偶数$a$,那么$a=2mn$ 因为$(m,n)$和$(a,b,c)$存在一一对应的关系,只需求出$a$可以分解成多少种$(m,n)$。通过求$\frac{a}{2}$的因子个数容易得到答案。

3.如果一开始给了一个奇数$b$,那么$b=m^2-n^2=(m+n)*(m-n)$ 只需求出$b$可以分解成多少种$(m+n,m-n)$ 通过求出b的因子个数容易得到答案。

现学了点用latex表示数学公式的语法,就拿这篇博文做做练习. 马上要去上大学啦,给自己加个油,大学里一定要继续努力。

时间: 2024-10-19 22:03:10

勾股数组 学习笔记的相关文章

勾股数组【学习笔记】

本原勾股数组(简写为PPT)是一个三元组(a,b,c),其中a,b,c没有公因数,且满足.例如下面是一项本原勾股数组: (3,4, 5),(5,12,13),(8,15,17),(7,24,25),(9,40,41),(11,60,61),(28,45,56),(33,56,65). 由这个短表容易得到一些结论,例如,似乎a与b奇偶性不同且c总是奇数. 证明如下: 若a与b都是偶数,则c也是偶数,意味着a,b,c有公因数2,所以三元组不是本原的,其次,若a,b都是奇数,那么c必然是偶数,这样假设

「整理」勾股数组

我们大概老早就知道勾股定理,它大概就长这样: \[a^2+b^2=c^2\] 嗯,的确够简单的. 而且我们清楚地知道它的一个基本应用--知道\(Rt\Delta\)的两边长,求第三边.这大概初一就学了. 对于不知道勾股定理的童鞋们,不了解没关系,因为这里没有三角形,也不是探讨怎么求第三边,我们只探讨勾股数组. 这里的\(a \equiv b(mod\ c)\)其实就是\(a\%c=b\%c\),a|b其实就是\(b\%a=0\),希望小白们不要看不懂. 如果真的看不懂,可以先学习同余.约数.素数

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

[题意] 给出三角形的三个边长,均是10^7以内的整数,问三角形的三个角的坐标是否能均是整数,输出其中任意一个解. [题解] 一开始想的是枚举一条边的横坐标,然后通过勾股定理以及算角度求出其他点的坐标,再判断是否符合条件. 亲测TLE 直到知道了本源勾股数组的构造方法... 每个本源勾股数组(a,b,c)满足a*a+b*b=c*c,其中a为奇数,b为偶数.. 枚举s,t(1<=t<s,且它们是没有公因数的奇数) a=st b=(s*s-t*t)/2 c=(s*s+t*t)/2 因为最大数c=(

后缀数组学习笔记【详解|图】

后缀数组学习笔记[详解] 老天,一个后缀数组不知道看了多少天,最后终于还是看懂了啊! 最关键的就是一会儿下标表示排名,一会用数值表示排名绕死人了. 我不知道手跑了多少次才明白过来.其实我也建议初学者手跑几遍,但是一定要注意数组的意义,否则就是无用功. 数组含义: s[ ]:输入的字符串,预处理的时候会在末尾加上一个0 sa[ ]:它的下标就是后缀排名 x[ ] = t[ ]:用来保存第一关键字排名,注意!它的数值是排名.初始时恰好是字符串的ASCII码.字典序嘛! y[ ] = t2[ ]:它的

勾股数组及其应用uva106

勾股数组 设三元组(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

蓝鸥Unity开发基础—— 一维数组学习笔记

蓝鸥Unity开发基础-- 一维数组学习笔记 一.数组 之前我们学过很多数据类型,今天我们来学习数字,数字也是一种数据类型,那么,具体的数组是如何定义的? 数组:相同数据类型的成员组成的一组数据 Int类型数组:4  7  12  3  5--数组元素 Float数据类型数字:11.5 4.62 7.1 2.21 9.3--数组元素 数组中每一个元素都会分配一个数组下标,数组下标是从0开始的,有序排列,如:0 1 2 3 4 二.声明并初始化数组: 数组也是数据类型,所以也可以声明变量.使用ne

蓝鸥Unity开发基础—— 二维数组学习笔记

蓝鸥Unity开发基础-- 二维数组学习笔记 一.二维数组 有两个下标的数组叫做二维数组 类似[,]数组名=new类型[常量表达式1,常量表达式2] int[,] numbers= new int[2,3]; [0,0] [0,1] [0,2] [1,0] [1,1] [1,2] 举例说明 using System; namespace Lesson16{    class MainClass    {        public static void Main (string[] args)

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

《C#高级编程》【第六章】数组 -- 学习笔记

       为了解决大量的同类型元素,于是数组就孕育而生了.数组是具有一定顺序关系的若干对象的集合体,一维数组可以看作是定长的线性表.反之,n为的数组可以看作线性表的推广.从存储结构上来看,数组是一段连续的存储空间.现在我们看看在C#中的数组: 1.普通数组 在C#中普通数组又可以分为一维数组.多维数组和锯齿数组. <1>一维数组 我们现在先看看一维数组的声明语法: 类型[] 变量名; 知道怎么声明了,现在我们继续看看数组的初始化吧,在C#中有4种初始化的方式: //n为数组长度,an为