我在这里证明不解释。 因为这篇文章的目的是为了方便地理解pgddzp定理。
可以在算法问题上使用了。 主要针对解决问题。
pgddzp定理(又称drdqz定理)
对于特殊性:方程ax by=1,只有当整数a和b互为质时,方程才具有整数解。
pgddzp定理的证明视频
pgddzp定理的证明文章
扩展蓝色朋友算法是为了用已知的a、b求解一组x、y,使它们满足pgddzp(DRDqz )等式。 axby=gcd ) a,b )=d
扩展lsdhm算法——exgcd
877. 扩展lsdhm算法
3359 www.AC wing.com/problem/content/description/879 /
# include cstdio # includeiostreamusingnamespacestd; intexgcd(inta,int b,int x,int y ) ) if (! b ) ) x=1,y=0; return a; (intd=EXgcd ) b、a%b、y、x ); y=y-a/b*x; 返回d; (intmain ) void ) ) { int t; cint; while(t-- ) { int a、b、x、y; cinab; exgcd(a,b,x,y ); coutx' 'yendl; } return 0; } # include bits/stdc.husingnamespacestd; intexgcd(inta,int b,int x,int y ) ) if (! b ) return x=1,y=0,a; intd=exgcd(b,a%b,y,x ); y=y-a/b*x; 返回d; (intmain ) void ) { int n; cinn; while(n-- ) { int a、b、x、y; cinab; exgcd(a,b,x,y ); coutx' 'yendl; } return 0; (878 .线性同余方程
3359 www.AC wing.com/problem/content/880 /
这不是pgddzp定理吗? 我知道1可以用扩展的lsdhm来求解。 和上面的一样。
但是这里是b。 先求axmy=gcd(a,m ),最后乘以倍数就可以了。
我们平时都要求这样的事情。
那么,这里也同样求出一个x,再乘以另一个数就是b即xxb/gcd(a,m )
注意的是:b必须是gcd(a,m )的倍数。 如果不是倍数,在求x的过程中会乘以小数。 那样的话x不是整数。
主题明确给出的x必须是整数。
结果取m模,为了防止InTax%m==(a*x%m ) ) m破裂,结果需要取m模
# include cstdio # include iostream # includealgorithmusingnamespacestd; typedef long long int LL; llexgcd(lla,LL b,LL x,LL y ) { if (! b ) ) x=1,y=0; return a; (intd=EXgcd ) b、a%b、y、x ); y=y-a/b*x; 返回d; (intmain ) void ) ) { int t; cint; wile(t-- ) lla,b,m; cinabm; LX,y,d; d=exgcd(a,m,x,y ); if(b%d ) cout'impossible'endl; else coutx*b/d%mendl; } return 0; } # include bits/stdc.husingnamespacestd; typedef long long int LL; llexgcd(lla,LL b,LL x,LL y ) { if (! b ) return x=1,y=0,a; intd=exgcd(b,a%b,y,x ); y=y-a/b*x; 返回d; (intmain ) void ) ) { int n; cinn; while(n-- ) lla,b,m,x,y,d; cinabm; d=exgcd(a,m,x,y ); if(b%d ) puts ) ) impossible ); else coutx*b/d%mendl; } return 0; }