文章目录
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;
}
小结
这节理论性强,看得云里雾绕,以欧几里德法求最大公约数为起点,出了扩展欧几里德算法,应用于同余方程组的求解等