• 辗转相除法、扩展欧几里得


    辗转相除法:求gcd(a,b)

    扩展欧几里得:解关于x和y的方程:a*x+b*y=gcd(a,b)

          推广:对于关于x和y的方程a*x+b*y=n

             有整数解的条件是n%gcd(a,b)==0

           所以这种方程可以这样解:

             先解方程a*x'+b*y'=gcd(a,b)

             因而x=x'*n/gcd(a,b) , y=y'*n/gcd(a,b)

    若方程a*x+b*y=c的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+k*b',y0-k*a')。

    其中a'=a/gcd(a,b),b'=b/gcd(a,b)。  k取任意整数

    总结一下这类问题的解法:
    对于方程ax+by=c
    设tm=gcd(a,b)
    先用扩展欧几里得求出方程ax+by=tm的解x0、y0
    然后有a*x0+b*y0=tm
    令x1=x0*(c/tm),y1=y0*(c/tm)
    则a*x1+b*y1=c
    x1、y1即原方程的一个特解
    这个方程的通解:xi=x1+k*(b/m),yi=y1-k*(a/m)
    另:如果要求yi的最小非负解?令r=a/tm,则解y2=(y1%r+r)%r
    其他类似的要求自己用纸算一算,YY一下就行了

     1     int gcd(int a,int b){  
     2         if (b==0) return a;  
     3         return gcd(b,a%b);  
     4     }  
     5 
     6 
     7 ------------------------------------------------
     8 
     9   
    10     int extgcd(int a,int b,int& x,int& y){  
    11         int d=a;  
    12         if (b!=0){  
    13             d=extgcd(b,a%b,y,x);  
    14             y-=(a/b)*x;  
    15         }else{  
    16             x=1;y=0;  
    17         }  
    18         return d;  
    19     }  

    Reference:http://blog.csdn.net/lhfight/article/details/7755994

          http://blog.sina.com.cn/s/blog_6f71bea30100o4v9.html

         

  • 相关阅读:
    DOM
    JavaScript 数组的方法总结
    vuex 状态持久化插件 —— vuex-persistedstate
    移动端1px细线
    CSS多行文本并显示省略号
    Java面试题
    Git提交分支
    Redis的安装配置
    Spring IoC
    单例模式
  • 原文地址:https://www.cnblogs.com/pdev/p/4065912.html
Copyright © 2020-2023  润新知