这道题是一道比较经典的水题,重点在于理解同余方程。
只需利用数论的定理就能够很轻松的解决。
参见下列代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
if(b==0){x=1,y=0;return a;}
int xx,yy;
int g=exgcd(b,a%b,xx,yy);
x=yy;
y=xx-(a/b)*yy;
return g;
}
void insolve(){
int a,b,c,x,y,k;
scanf("%d%d",&a,&b); //ax+by==1
b=-b,c=1; //转化为ax-by==c;
int g=exgcd(a,b,x,y); //得到一组解
//此题保证有解,不考虑c%g!=0
int x0=c/g*x,y0=c/g*y; //接下来只需考虑如何得到最小正整数解
//通式:x0+k*b/g;
int exb=b/g;
k=-x0/exb;
if(exb>0) if(k*exb<-x0) k++;
if(exb<0) if(k*exb<-x0) k--;
printf("%d\n",x0+k*exb);
}
int main(){
insolve();
return 0;
}