应用方面:
1.求解乘法逆元
2.求解(ax)%b=c
即 a个x 模上b后得到c,其中满足条件的x的最小整数。[也可表示为ax=c(mod b)]
3.求解直线上的整点数
模板代码:
代码1:
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll g=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return g;
}
代码2:
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){//d为最大公约数
if(!b){
x=1,y=0,d=a;
return;
}
exgcd(b,a%b,d,y,x)
y-=a/b*x;//这里已经交换了位置,即y=x2,x=y2
}
证明以及推算过程:
附带例题:
代码详解:
#include<iostream>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll g=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return g;
}
ll n,d,x,y,a,b;
int main(){
int t;
cin>>t;
while(t--){
scanf("%lld%lld%lld%lld",&n,&d,&x,&y);
int gcd=exgcd(n,d,a,b);
if((y-x)%gcd){
printf("Impossible\n");
}else{
b*=(y-x)/gcd;
n/=gcd;
printf("%lld\n",(b%n+n)%n);
}
}
return 0;
}