題解:本題主要考查擴展歐幾里得定理。
簡要題意:求ax≡1(modb)最小正整數解
1.擴展歐幾里得定理:ax≡1(modb),等價與a∗x+m∗y=1 ,
因爲裴蜀定理ax+by=z,則gcd(a,b)∣z 則gcd(a,b)=1;
又因爲gcd(a,b)=gcd(b,amodb)所以b∗x1+(amodb)∗y1=gcd;
又因爲amodb=a−(a/b)∗b;
所以b∗x1+(a−(a/b)∗b)∗y1
=b∗x1+a∗y1–(a/b)∗b∗y1
=a∗y1+b∗(x1–a/b∗y1)=gcd
所以x=y1,y=x1–a/b∗y1;
因此到最後,如果x太小就不斷加b直到大於等於0,太大則一直減b,直到最小正整數解。直接求模實現更快。
(其實暴力也可,親測70分QwQ)
代碼如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long a,b,x,xx,y;
void exgcd(long long a,long long b)
{
if(b==0)
{
x=1;y=0;
return ;
}
exgcd(b,a%b);
xx=x;x=y;y=xx-(a/b)*y;
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin>>a>>b;
exgcd(a,b);
cout<<(x+b)%b;
return 0;
}