数学|扩展欧几里得算法模板题

扩展欧几里得算法模板题 【数学|扩展欧几里得算法模板题】P1082 同余方程
这就是一个有一点小弯的扩展欧几里得的模板题
根据 ax ≡ 1( mod b) 这个方程你应该化简成ax - by = 1 的形式.然后就可以AC了

#include using namespace std; #define ll long long int ll exgcd(ll m, ll n, ll & x, ll & y) { if(n==0) { x=1; y=0; return m; } else { ll r=exgcd(n,m%n,x,y); ll temp=y; y=x-(m/n)*y; x=temp; return r; } } int main() { ll a,b,c,d,e,f; ll x,y; cin>>a>>b; c=exgcd(a,b,x,y); /// 这里求得c是最大公约数,因为刚刚给的方程ax - by = 1 如果存在x、y的值的话c就一定是互质的 /// 这里题目给的是一定存在,所以c的值就一定为1。所以这里看你们心情加就行了。 if(c==1) { if(x<0) while(x<0) x+=abs(b); else { while(x>0) x-=abs(b); x+=abs(b); } cout<=0) //x=x%t; //else //x=x%t+t; //cout<

因为最后题目要求是求出x的最小的非零值,所以我们有这么个结论:
ax+by=1
a x + b y + k × b a ? k × b a = 1
a ( x + k b ) + ( y ? k a) b = 1
所以我们知道在x的后面加上k倍的b和y的后面同时减去k倍的a这个等式依旧成立,
所以根据这对结果进行简单处理一下就成了。

    推荐阅读