涉及知识点:
solution:
- \(这是一道数论裸题,可以直接当板子用\)
- \(≡是一个同余符号,即 a*x\)%\(b = 1\)%\(b\)
- \(上式可以化简成 ax+by = 1,y是任意正整数\)
- \(接下来引入今天的知识点:扩展欧几里得算法,下面给出定义:\)
- \(若 a,b 是整数,且 gcd(a,b)=d,那么对于任意的整数x,y\)
- \(ax+by 都一定是 d 的倍数,特别地,一定存在整数 x,y,使 ax+by=d 成立\)
- 扩展欧几里得证明
- \(这一题由于是要找到最小正整数解,如果求出的x是负数,需要再加上一个b\)
- \(比如5x + 6y = 1,x最小的整数解是-1,如果不限制最小整数解,还可以是5,11....\)
- \(如果你还是啥都没听懂,就把这个当作一个模板记住\)
- \(适用于:给出a,b,d,已知ax+by = d,求最小的x\)
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){
x=1,y=0;
return a;
}
ll r=exgcd(b,a%b,x,y);
ll t=y;
y=x-(a/b)*y;
x=t;
return r;
}
int main()
{
ll a,b,x,y;
scanf("%lld%lld",&a,&b);
ll e = exgcd(a,b,x,y);
x = (x+b)%(b);//如果没有要求是最小的正整数x,就把这一行去掉
printf("%lld\n",x);
return 0;
}