文章目录
5.7小节——数学问题->扩展欧几里德算法

1.扩展欧几里德算法


//扩展欧几里德算法
//欧几里德算法求最大公约数
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
//扩展欧几里德算法
int exGcd(int a,int b,int &x,int &y){
if(b == 0){
x=1;
y=0;
return a;
}
int g = exGcd(b,a%b,x,y);//递归
int temp = x;
x = y;
y = temp - a/b*y;
return g;
}
2.方程ax + by = c的解
晕菜,理论推导没看懂,就不截图了
3.同余式的求解

4.逆元的求解以及(b/a)%m的计算

//求逆元
int inverse(int a,int b){
int x,y;
int g = exGcd(a,m,x,y);
return (x % m + m) % m;
}
Codeup习题
5124-Problem-A-同余方程-NOIP2012TGD2T1
题目链接:http://codeup.cn/problem.php?cid=100000594&pid=0

//5124-Problem-A-同余方程-NOIP2012TGD2T1
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
//#define ll long long
//扩展欧几里德算法求得ax = y的解
ll exGcd(ll a,ll b,ll &x,ll &y){
if(b == 0){
x=1;
y=0;
return a;
}
int g = exGcd(b,a%b,x,y);//递归
int temp = x;
x = y;
y = temp - a/b*y;
return g;
}
int main()
{
//求同余方程ax ≡1(mod b)的最小正整数解,即求(a-b)%x=0的最小值
ll a,b;
while(cin>>a>>b){
ll i = 0;
ll x,y;
exGcd(a,b,x,y);
cout<<(x%b + b) % b<<endl;
//最小非负整数解(x%(b/gcd)+(b/gcd)) % (b/gcd)
}
return 0;
}
小结
这节理论性强,看得云里雾绕,以欧几里德法求最大公约数为起点,出了扩展欧几里德算法,应用于同余方程组的求解等
本文深入探讨了扩展欧几里德算法的原理及应用,包括最大公约数的求解、方程ax+by=c的解、同余方程的求解、逆元的求解以及(b/a)%m的计算。通过Codeup习题5124-Problem-A-同余方程-NOIP2012TGD2T1进行实战演练。
4582

被折叠的 条评论
为什么被折叠?



