同余方程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同余方程相关的知识,希望对你有一定的参考价值。

原题链接:https://www.luogu.org/problem/show?pid=1082#sub

此题乃exgcd的模板题,当然也可以用费马小定理做(赤裸裸的逆元啊)

还记得exgcd是啥吗?扩展欧几里得算法,用来求解形似ax+by = gcd(a,b)一类方程的解。

那和这个题有什么关系啊?这个题要求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解,我们把这个式子展开看一下。

由同余式的意义,可以得知ax % b=1, 1%b =1,可以转化成方程ax+by=1,然后要求这个方程的一组解。

很显然,这个方程代表的是一条直线,满足这个方程的解对应的点都在这条直线上,即有无数个解,我们要找的是最小的正整数解x。

(y到底是多少没必要去关心,我们求的是x,这样等价正好满足扩欧)

同时,这个方程在gcd(a,b)!=1时无解,不过没关系啦,本题保证一定有解。

我们用扩欧求出的解并不一定是最小解,所以输出的时候要对b取模。

负数解怎么办?先加一个b,再对b取模,搞定。

参考代码:

 1 #include <iostream>
 2 using namespace std;
 3 long long int a,b,x,y;
 4 void exgcd(long long int a,long long int b,long long int &x,long long int &y){
 5     if (!b){
 6         x = 1;
 7         y = 0;
 8     }
 9     else{
10         exgcd(b,a%b,y,x);
11         y -= (a/b) * x;
12     }
13 }
14 int main(){
15     cin >> a >> b;
16     exgcd(a,b,x,y);
17     cout << (x+b) % b << endl;
18     return 0;
19 }

 

以上是关于同余方程的主要内容,如果未能解决你的问题,请参考以下文章

『线性同余方程和中国剩余定理』

HDU-1573-X问题(线性同余方程组)

解一元同余方程组

线性同余方程组

poj2891同余方程组

线性同余方程的求解