题解:本题主要考查扩展欧几里得定理。
简要题意:求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;
}