浅谈扩展gcd(exgcd)+例题P1082
原创
©著作权归作者所有:来自51CTO博客作者mb5c5a77ee6227c的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天考完马原,下午在家睡了一下午,晚上啥也学不进,就复习一下exgcd的知识,以模板题为例。
同余方程
题目描述
求关于 的同余方程
输入格式
一行,包含两个正整数 a,b用一个空格隔开。
输出格式
一个正整数 ,即最小正整数解。输入数据保证一定有解。
分析
1: (mod b)
2: 为什么等于 呢?
- 由于题目给出一定有解,则%,则a,b互质。
3: 已知,那么不就是让我们求exgcd吗?
4:证明:
- (1)由于%通过辗转相除法可得到最小公因数,则%
- (2)%
- (3)由%
可得公式:
易得:
由以上推导,exgcd通过回溯法,由子问题,可递归得到最终解
参考代码:
#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long ll;
const int inf = 1 << 30;
const int maxn = 2e5 + 5;
const int N = 1e3 + 5;
const int base = 131;
//vector<vector<int>> vec;
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b, x, y);
ll t = x;
x = y, y = t - a / b * y;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll a, b, x, y;
cin >> a >> b;
exgcd(a, b, x, y);
while (x <= 0)
x += b;
cout<<x<<endl;
}