1.欧几里得:求gcd:
int gcd(int a,int b)
{
if(b==0) return a;
gca(b,a%b);
}
2.拓展欧几里得
ax % by ==gcd(a,b)。
int x,y;
int exgcd(int a,int b)
{
if(b==0)
{
x=1;y=0;return a;//a是最大公约数
}
int ans=exgcd(b,a%b);
int temp=y;
y=x-(a/b)*y;
x=temp;
return ans;//返回最大公约数
}
确实好难。
拓展欧几里得
需要先会欧几里得,
求gcd的。
a=b, b=a%b
然后看解析吧。
太难了。
解析传送门
AC
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long int ll;
ll x,y;
void exgcd(ll a,ll b)
{
if(b==0)
{
x=1;y=0;return;
}
exgcd(b,a%b);
ll temp=y;
y=x-(a/b)*y; //需要模拟一下。上面已经进入了深一层的递归,
//能到这里一定是上一层了。所以a是a,b是b,不是a=b,b=a%b。出来上一层了。
x=temp;
}
int main()
{
int a,b;
cin>>a>>b;
exgcd(a,b);
x=(x%b+b)%b;
cout<<x;
}