涉及知识点:
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
",x);
return 0;
}