好久没发博客了,总结下今晚学的扩展欧几里得吧
虽然现在也没学会
ax + by = c
扩展欧几里得知道a b c 求x y
求乘法逆元
a*x = 1(mod m)
知道a和m 求x
先复习一下欧几里得求最大公约数吧
inr gcd(int x,int y)
{
if(y==0) return x;
else return gcd(y,x%y);
}
求 ax + by = c。
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
int r = exgcd(b,a%b,x,y);
int t = x;x = y;
y = t - a/b*y;
return r;
}
int main()
{
int a,b,c,x,y;
while(cin>>a>>b>>c){
int d = exgcd(a,b,x,y);
if(c%d)
printf("-1\n");
int k = c/d;
x*=k;
y*=k;
printf("%d %d\n",x,y);
}
return 0;
}
求乘法逆元
int exgcd(int a,int b,int &x,int &y)
{
if(a==0&&b==0) return -1;
if(b==0)
{
x = 1;
y = 0;
return a;
}
int r = exgcd(b,a%b,y,x);
y -= a/b*x;
return r;
}
int cal(int a,int m)
{
int x,y;
int gcd=exgcd(a,m,x,y);
if(gcd==1) return (x%m+m)%m;
return -1;
}
int main()
{
int a,m;
while(cin>>a>>m){
int n = cal(a,m);
cout<<n<<endl;
}
return 0;
}

509

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



