题目化简 a x − y b = 1 ax -yb = 1 ax−yb=1 要求最小x.典型扩展欧几里得方程式。
显然 1 ∣ g c d ( a , b ) 1 | gcd(a,b) 1∣gcd(a,b) 故方程始终有解。
用模板求出 x.
对方程 a x + b y = c , x = x + k b 且 b = b g c d ( a , b ) ax+by = c,x = x + kb 且 b= \frac{b}{gcd(a,b)} ax+by=c,x=x+kb且b=gcd(a,b)b
见博客,性质1
所以把答案范围控制再 (0, b g c d ( a , b ) \frac{b}{gcd(a,b)} gcd(a,b)b-1)
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int mod = 1e9+7;
const int N = 2e5+10;
int exgcd(int a,int b,int &x,int &y){
if(b == 0){
x = 1,y = 0;
return a;
}
int d = exgcd(b,a%b,y,x);
y -= a/b * x;
return d;
}
signed main(){
IOS
#ifdef ddgo
freopen("C:\\Users\\asus\\Desktop\\ddgoin.txt","r",stdin);
#endif
int a,b; cin>>a>>b;
int x,y;
int d = exgcd(a,b,x,y);
int p = b/d;
cout<<(x % p + p) % p<<endl;
return 0;
}