【模板复习】
SOL
对于
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
ax+by=gcd(a,b),我们可以得到
b
x
′
+
(
a
m
o
d
b
)
y
′
=
g
c
d
(
a
,
b
)
bx'+(a~mod~b)y'=gcd(a,b)
bx′+(a mod b)y′=gcd(a,b)
进一步化简:
b
x
′
+
(
a
−
(
a
/
b
)
∗
b
)
y
′
=
g
c
d
(
a
,
b
)
bx'+(a-(a/b)*b)y'=gcd(a,b)
bx′+(a−(a/b)∗b)y′=gcd(a,b)
∴
a
y
′
+
b
(
x
′
−
a
/
b
∗
y
′
)
=
g
c
d
(
a
,
b
)
\therefore ay'+b(x'-a/b*y')=gcd(a,b)
∴ay′+b(x′−a/b∗y′)=gcd(a,b)
∴
x
=
y
′
,
y
=
x
′
−
a
/
b
∗
y
′
\therefore x=y',y=x'-a/b*y'
∴x=y′,y=x′−a/b∗y′
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
inline int rd(){
int re data=0,w=1;static char ch=0;ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(isdigit(ch))data=(data<<1)+(data<<3)+(ch^48),ch=getchar();
return data*w;
}
int n,m,x,y;
inline int exgcd(int a,int b,int &x,int &y,int ret=0){
if(!b){x=1,y=0;return a;}
else{
ret=exgcd(b,a%b,x,y);
int re t=x;x=y;y=t-a/b*y;
return ret;
}
}
signed main(){
n=rd(),m=rd();
int re gcd=exgcd(n,m,x,y);
m/=gcd;
cout<<(x%m+m)%m;
exit(0);
}