今天考完马原,下午在家睡了一下午,晚上啥也学不进,就复习一下exgcd的知识,以模板题为例。

​同余方程​

题目描述
求关于 浅谈扩展gcd(exgcd)+例题P1082_ios 的同余方程 浅谈扩展gcd(exgcd)+例题P1082_#include_02

输入格式
一行,包含两个正整数 a,b用一个空格隔开。

输出格式
一个正整数 浅谈扩展gcd(exgcd)+例题P1082_ios,即最小正整数解。输入数据保证一定有解。

分析
1: 浅谈扩展gcd(exgcd)+例题P1082_#include_02 (mod b) 浅谈扩展gcd(exgcd)+例题P1082_ios_05

2: 为什么等于 浅谈扩展gcd(exgcd)+例题P1082_#include_06呢?

  • 由于题目给出一定有解,则浅谈扩展gcd(exgcd)+例题P1082_ios_07%浅谈扩展gcd(exgcd)+例题P1082_同余方程_08,则a,b互质。

3: 已知浅谈扩展gcd(exgcd)+例题P1082_ios_09,那么不就是让我们求exgcd吗?

4:证明: 浅谈扩展gcd(exgcd)+例题P1082_同余方程_10

  • (1)由于浅谈扩展gcd(exgcd)+例题P1082_#include_11%浅谈扩展gcd(exgcd)+例题P1082_ios_12通过辗转相除法可得到最小公因数,则浅谈扩展gcd(exgcd)+例题P1082_ios_13%浅谈扩展gcd(exgcd)+例题P1082_ios_14
  • (2)浅谈扩展gcd(exgcd)+例题P1082_ios_13%浅谈扩展gcd(exgcd)+例题P1082_ios_16
  • (3)浅谈扩展gcd(exgcd)+例题P1082_同余方程_17%浅谈扩展gcd(exgcd)+例题P1082_同余方程_18
    可得公式:浅谈扩展gcd(exgcd)+例题P1082_同余方程_19
    易得:浅谈扩展gcd(exgcd)+例题P1082_#include_20
  • (4)回转(2)带入化简得:浅谈扩展gcd(exgcd)+例题P1082_ios_21,由于浅谈扩展gcd(exgcd)+例题P1082_同余方程_22已知则可得浅谈扩展gcd(exgcd)+例题P1082_同余方程_23

由以上推导,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;
}