颓废了一个暑假,想做点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|(c2−b2)=a2 → d|a → gcd(a,b,c)>1 矛盾。 另外两种情况类似。
2.a和b必定一个是奇数一个是偶数.
反证: 如果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,m2−n2,m2+n2)的形式。 反解m,n可以得到
m=√c+b2 n=√c−b2 .
只需证明√c+b2和√c−b2都是正整数,即证明c+b2和c−b2都是完全平方数。
a2=c2−b2=(c−b)∗(c+b).
先证明d=gcd(c−b,c+b)=2 :
d|c+b,d|c−b → d|2b,d|2c → d|gcd(2b,2c) → d|2gcd(b,c) → d|2
而b,c均为偶数,那么c−b,c+b也都是偶数,那么gcd(c−b,c+b)只能是2. 所以有gcd(c−b2,c+b2)=1
因为(a2)2=c−b2∗c−b2 且gcd(c−b2,c+b2)=1,所以c−b2和c+b2都是完全平方数。
故(a,b,c)可以表示为(2mn,m2−n2,m2+n2)的形式,只需取m=√c+b2 n=√c−b2 .
这就给出了构造勾股数组的一个公式,因为(m,n)和(a,b,c)存在一一对应的关系。
再回到最开始的CF的那道题。
1.如果一开始给的数<=2,那么肯定无解,因为不存在一个勾股数组里面有元素<3.
证明:不妨设a<=b<c, 因为a2=(c−b)∗(c+b) (c+b)−(c−b)=2b>=2 如果a<=2 那么a2=(c−b)∗(c+b)<=4 容易检验无解。
2.如果一开始给了一个偶数a,那么a=2mn 令n=1,m=a2即可构造出一组(a,b,c).
3.如果一开始给了一个奇数b,那么b=m2−n2=(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)。通过求a2的因子个数容易得到答案。
3.如果一开始给了一个奇数b,那么b=m2−n2=(m+n)∗(m−n) 只需求出b可以分解成多少种(m+n,m−n) 通过求出b的因子个数容易得到答案。
现学了点用latex表示数学公式的语法,就拿这篇博文做做练习. 马上要去上大学啦,给自己加个油,大学里一定要继续努力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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