扩展欧几里得算法

转洛谷P1208同余方程  -> (https://www.luogu.org/problemnew/show/P1082)


 

这就是一个有一点小弯的扩展欧几里得的模板题
根据 ax ≡ 1( mod b) 这个方程你应该化简成ax - by

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long int
 4 ll exgcd(ll m, ll n, ll & x, ll & y)
 5 {
 6     if(n==0)
 7     {
 8         x=1;
 9         y=0;
10         return m;
11     }
12     else
13     {
14         ll r=exgcd(n,m%n,x,y);
15         ll temp=y;
16         y=x-(m/n)*y;
17         x=temp;
18         return r;
19     }
20 }
21 int main()
22 {
23     ll a,b,c,d,e,f;
24     ll x,y;
25     cin>>a>>b;
26     c=exgcd(a,b,x,y); 
27    /// 这里求得c是最大公约数,因为刚刚给的方程ax - by = 1 如果存在x、y的值的话c就一定是互质的
28    /// 这里题目给的是一定存在,所以c的值就一定为1。所以这里看你们心情加就行了。
29     if(c==1)
30     {
31         if(x<0)
32         while(x<0)
33             x+=abs(b);
34         else
35         {
36             while(x>0)
37                 x-=abs(b);
38             x+=abs(b);
39         }
40         cout<<x<<endl;
41     }
42     return 0;
43 }

注意::

因为最后题目要求是求出x的最小的非零值,所以我们有这么个结论:
ax+by=1
a x + b y + k × b a − k × b a = 1
a ( x + k b ) + ( y − k a) b = 1
所以我们知道在x的后面加上k倍的b和y的后面同时减去k倍的a这个等式依旧成立,
所以根据这对结果进行简单处理一下就成了。

上一篇:扩展欧几里得(模板)


下一篇:【学亮IT手记】jQuery text()/html()回调函数实例