zoukankan      html  css  js  c++  java
  • 扩展gcd算法

    扩展gcd算法


    神tm ×度搜索exgcd 打到exg的时候出来ex咖喱棒。。。

    球方程(ax+by=gcd(a,b))的一个解

    如果(b=0),那么(gcd(a,b)=a),取(x=1,y=0)即可

    否则:显然(gcd(a,b)=gcd(b,amod b))

    那么可以递归球解(bx+(amod b)y=gcd(a,b))的解。

    然后还是要推当前(x,y)的。

    (bx+(amod b)y=gcd(a,b))的解为(x_0,y_0)
    (ax+by=gcd(a,b)=bx_0+(amod b)y_0)
    (=bx_0+ay_0-blfloorfrac{a}{b} floor y_0)
    (=ay_0+b(x_0-lfloorfrac{a}{b} floor y_0))

    那么(x=y_0,y=x_0-lfloorfrac{a}{b} floor y_0)

    核心代码:exgcd(a,b,&x,&y)返回(gcd(a,b))

    il ll exgcd(ll a,ll b,ll&x,ll&y){
    	ll ret;
    	if(b==0)x=1,y=0,ret=a;
    	else{
    		ret=exgcd(b,a%b,x,y);
    		ll x0=x,y0=y;
    		x=y0,y=x0-a/b*y0;
    	}
    	return ret;
    }
    

    一点点扩展:球(ax+by=c)的整数解。

    首先求解(ax+by=gcd(a,b)),然后如果(c)(gcd(a,b))的倍数就有解(等式两边同时乘即可)否则无解(显然)


    例题:poj1061 蛤蛤青蛙的约会

    设这两只蛤蛤跳(t)单位时间后跳到一起,相差(p)圈。列方程:

    [(X+tN)-(Y+tM)=Lp ]

    化简:

    [(N-M)t+Lp=X-Y ]

    然后就转化成了球解(ax+by=c)

  • 相关阅读:
    数组(array)
    亲戚(relative)
    [ZJOI2016]小星星
    P4782 【模板】2-SAT 问题
    CF1065F Up and Down the Tree
    CF1065C Make It Equal
    CF1060F Shrinking Tree
    CF1060E Sergey and Subway(点分治)
    CF1060D Social Circles
    CF1060C Maximum Subrectangle
  • 原文地址:https://www.cnblogs.com/xzz_233/p/8975944.html
Copyright © 2011-2022 走看看