求ax+by=1的最小解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
LL ex_gcd(LL a,LL b,LL &x,LL &y);
LL cal(LL a,LL b);
LL s1, s2;
int main()
{
LL m, n;
while(scanf("%I64d %I64d", &m, &n)!=EOF)
{
LL ans=cal(m,n);
if(ans==-1) printf("sorry\n");
else printf("%I64d %I64d\n",s1, s2);
}
return 0;
}
LL cal(LL a,LL b)
{
LL x, y;
LL gcd=ex_gcd(a,b,x,y);
if(1%gcd!=0) return -1;
x*=1/gcd;
b/=gcd;
if(b<0) b=-b;
s1=x%b;
if(s1<0) s1+=b;
s2=(1-a*s1)/b;
return 1;
}
LL ex_gcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL ans=ex_gcd(b,a%b,x,y);
LL tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}