Luogu P1082 同余方程(NOIP 2012) 题解报告
【题目大意】
求关于x的同余方程 ax≡1(mod b)的最小整数解。
【思路分析】
由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a,b)=1,于是就可以用欧几里得算法求出一组特解x0,y0。
那么x0就是原方程的一个解,通解则为所有模b与x0同余的整数,通过取模操作可以把解的取值范围移动到1~b之间,这样就得到了最小整数解。
【代码实现】
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll a,b,x,y; 5 ll exgcd(ll a,ll b,ll &x,ll &y){//欧几里得算法求特解 6 if(!b) {x=1;y=0;return a;} 7 ll d=exgcd(b,a%b,x,y); 8 ll z=x;x=y;y=z-y*(a/b); 9 return d; 10 } 11 int main(){ 12 cin>>a>>b; 13 exgcd(a,b,x,y); 14 cout<<(x%b+b)%b<<endl;//最小整数解一定在1~b范围内 15 return 0; 16 }