蓝桥杯_丢番图方程

a*x+b*y=c
d=gcd( a,b );
if( c%d==0 )
{
    x=x0+b/d*n;
    y=y0-a/d*n;
}

01 求线段两点间的格点

    ( y2-y1 )*x+( x1-x2 )*y=y2*x1-y1*x2;
    a=y2-y1;
    b=x1-x2;
    c=y2*x1-y1*x2;
    d=gcd( a,b );

    x1 < x < x2
    x1 < x1+b/d*n < x2
    -d < n < 0

    cnt=d-1;

02 pick 定理 s=j/2+k-1;

    引例:
        给出二维平面上的一个封闭的多边形,多边形的顶点都是格点。
        请计算多边形边界上格点数量 j,内部格点数量 k,以及多边形的面积 s

03 扩展欧几里得算法_求特解和gcd

    typedef long long LL;
    LL extend_gcd( LL a,LL b,LL& x,LL& y )
    {
        if( b==0 ) { x=1; y=0; return a; }
        LL d=extend_gcd( b,a%b,y,x );
        y-=a/b*x;
        return d;
    }

    01
        a*x0+b*y0=gcd(a,b)          (1)
        b*x1+(a%b)*y1=gcd(b,a%b)    (2)
        gcd(a,b)=gcd(b,a%b)         (3)

        (1)(2)(3) ==> a*x0+b*y0=b*x1+(a%b)*y1   (4)

        (a%b)*y1=(a-a/b*b)*y1                   (5)

        (4)(5) ==> a*x0+b*y0=b*x1+(a-a/b*b)*y1

        a*x0 b*y0
        a*y1 b*x1+(-a/b*b)*y1

        对比系数 ==> x0=y1 y0=x1-(a/b)*y1
    02 
        a*x+b*y=c
        extend_gcd() ==> x0,y0,d
        tt=c/d;
        x=x0*tt+b/d*n;
        y=y0*tt-a/d*n;

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125192724