勾股数组 学习笔记

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

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


 

1.首先如果 a2+b2=c2 , 则(ka)2+(kb)2=(kc)2 , 因此我们先只考虑gcd(a,b,c)=1的情况.而gcd(a,b,c)=1 暗含着 a,b,c两两互质。证明:  假设d=gcd(b,c)>1  那么有d|b,d|c  d2|b2,d2|c2  d2|(c2b2)=a2  d|a  gcd(a,b,c)>1 矛盾。 另外两种情况类似。     

2.ab必定一个是奇数一个是偶数.

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

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

m=c+b2    n=cb2 .  

只需证明c+b2cb2都是正整数,即证明c+b2cb2都是完全平方数。

a2=c2b2=(cb)(c+b).

先证明d=gcd(cb,c+b)=2 :   

 d|c+b,d|cb   d|2b,d|2c    d|gcd(2b,2c)    d|2gcd(b,c)    d|2

b,c均为偶数,那么cb,c+b也都是偶数,那么gcd(cb,c+b)只能是2.  所以有gcd(cb2,c+b2)=1

因为(a2)2=cb2cb2  且gcd(cb2,c+b2)=1,所以cb2c+b2都是完全平方数。

(a,b,c)可以表示为(2mn,m2n2,m2+n2)的形式,只需取m=c+b2    n=cb2

这就给出了构造勾股数组的一个公式,因为(m,n)(a,b,c)存在一一对应的关系。

 


 

 

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

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

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

2.如果一开始给了一个偶数a,那么a=2mnn=1,m=a2即可构造出一组(a,b,c).

3.如果一开始给了一个奇数b,那么b=m2n2=(m+n)(mn)mn=1,m+n=b 解出mn 就可以得到一组ac了.   

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

 


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

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

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

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

 

 

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

 

posted @   lzw4896s  阅读(1089)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2014-09-07 二模 (2) day1
点击右上角即可分享
微信分享提示