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 }
代码戳这里

 

posted @ 2019-03-09 16:56  小叽居biubiu  阅读(234)  评论(0编辑  收藏  举报