zoukankan      html  css  js  c++  java
  • 勾股数组 学习笔记

    颓废了一个暑假,想做点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$的情况.而$gcd(a,b,c)=1$ 暗含着 $a,b,c$两两互质。证明:  假设$d=gcd(b,c)>1$  那么有$d|b,d|c   o   d^2|b^2,d^2|c^2 o   d^2|(c^2-b^2)=a^2 o  d|a o  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{c+b}{2}}$    $n=sqrt{frac{c-b}{2}}$ .  

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

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

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

     $$d|c+b,d|c-b o d|2b,d|2c o d|gcd(2b,2c) o d|2gcd(b,c) o d|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{c+b}{2}}$    $n=sqrt{frac{c-b}{2}}$ . 

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


    再回到最开始的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表示数学公式的语法,就拿这篇博文做做练习. 马上要去上大学啦,给自己加个油,大学里一定要继续努力。

  • 相关阅读:
    【WP开发】记录屏幕操作
    【.NET深呼吸】清理对象引用,有一个问题容易被忽略
    【WP开发】JSON数据的读与写
    【WP8.1开发】RenderTargetBitmap类的特殊用途
    【WP 8.1开发】How to 图像处理
    【WP8.1开发】用手机来控制电脑的多媒体播放
    【WP 8.1开发】如何动态生成Gif动画
    【WP8.1开发】基于应用的联系人存储
    使用awk处理文本
    PHP数组和字符串的处理函数汇总
  • 原文地址:https://www.cnblogs.com/vb4896/p/5851100.html
Copyright © 2011-2022 走看看