题面在这↓
http://codevs.cn/problem/1200/
题意:exgcd裸题,求ax%b=1也就是ax-by=1。推导exgcd公式套上即可。
什么是exgcd呢 就是这个 ax+by=gcd(a,b) 东西,给你a,b的值求x,y的值。
推导:
a*x1+b*y1=gcd(a,b) 是由 b*x2+(a%b)y2=gcd(b,a%b)推导来的;
so
a*x1+b*y1= b*x2+(a%b)y2
a*x1+b*y1=b*x2+(a-a/b*b)y2
a*x1+b*y1=b*x2+a*y2-a/b*b*y2
a*x1+b*y1=a*y2+b(x2-a/b*y2)
so
x1=y2 y1=x2-a/b*y2
如果 x<0 怎么办呢
int haha=b/__gcd(a,b)
while(x<0) x+=haha;
x%=haha;
如果 x+k*b/gcd(a,b) 对应的 y+k*a/gcd(a,b)
完成!
#include<iostream>
#include<cstdio>
using namespace std;
int x,y;
void gcd(int a,int b)
{
if(b==0)
{
x=1;y=0;
return ;
}
gcd(b,a%b);
int x2=x,y2=y;
x=y2;
y=x2-a/b*y2;
}
int main()
{
int a,b;
cin>>a>>b;
gcd(a,b);
if(x<0) x+=b; //注意 x有可能是负的
cout<<x%b;
}