P1082 同余方程—洛谷——算法笔记

题目描述

求关于x xx的同余方程 ax≡1(modb) a x \equiv 1 \pmod {b}ax1(modb) 的最小正整数解。

输入输出格式

输入格式:

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

输出格式:

一个正整数 x0x_0x0,即最小正整数解。输入数据保证一定有解。

输入输出样例

输入样例#1: 复制

3 10

输出样例#1: 复制

7

说明

【数据范围】

对于 40%的数据,2≤b≤1,0002 ≤b≤ 1,0002b1,000

对于 60%的数据,2≤b≤50,000,0002 ≤b≤ 50,000,0002b50,000,000

对于 100%的数据,2≤a,b≤2,000,000,0002 ≤a, b≤ 2,000,000,0002a,b2,000,000,000

NOIP 2012 提高组 第二天 第一题

题解:

看题目起始就是求 a 的逆元 x,所以直接套用扩展欧几里得算法模板即可。要注意的是题目要去输出的数是正整数,因此需要在最后输出的结果上加个 b 再取模。

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;

#define INF 0x3f3f3f
#define ll long long
#define clean(arrays) memset(arrays, 0, sizeof(arrays))



// 求解得到的 x 就是 a 的逆元,y 就是 b 的逆元。
ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll r = exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;

    return r;
}


int main()
{
    ll a, b, x, y;
    cin >> a >> b;
    exgcd(a, b, x, y);
    cout << (x + b) % b <<endl;     //避免 x 是负数
    return 0;
}

求逆元的方法可以参考这篇文章:https://blog.csdn.net/weixin_43207025/article/details/90611945

你可能感兴趣的:(数论,算法笔记)