当前位置: 代码迷 >> 综合 >> 洛谷oj - P1082 同余方程(扩展欧几里德)
  详细解决方案

洛谷oj - P1082 同余方程(扩展欧几里德)

热度:36   发布时间:2023-10-09 15:17:02.0

题目描述

求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

输入输出格式

输入格式:

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

输出格式:

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

输入输出样例

输入样例#1:
3 10
输出样例#1:
7

说明

【数据范围】

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

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

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


题目思路:

ax ≡ 1 (mod b)  即 ax%b = 1  变形后得到ax%b + by%b = 1   及 (ax + by) % b = 1  我们可以根据扩展欧几里德算法求得 ax + by = gcd(a,b)的通解。由通解求出题目的最小整数解即可。

题目代码:

#include <cstdio> 
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
//扩展欧几里德  
LL exgcd(LL a, LL b, LL &x, LL &y){if(!b){ x = 1; y = 0; return a; }else {exgcd(b, a%b, y, x); y -= x*(a/b);}
}int main(){freopen("input.txt", "r" , stdin);LL a,b,x,y;scanf("%lld %lld",&a, &b);exgcd(a,b,x,y);LL ans = (x%b+b)%b; // 消除负数// 因为gcd(a,b) == 1 printf("%lld\n",ans);return 0;
}