P1082 同余方程

题面:https://www.luogu.org/problemnew/show/P1082

本题即扩欧求乘法逆元,注意我们将要求出来的x,y, 仅仅保证满足ax+by=1,而 x 不一定是最小正整数解。有可能太大,也有可能是负数。这依然可以解决,那就是,x批量地减去或加上b,能保证 ax+by=1:
ax+by=1
ax+by+k×ba−k×ba=1
a(x+kb)+(y−ka)b=1
Code:
#include <iostream>  
#include <cstdio> 
using namespace std;
int a,b,x,y,k;
void exgcd(int a,int b)
{
    if(b==0)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b);
    k=x;
    x=y;
    y=k-a/b*y;
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>a>>b;
    exgcd(a,b);
    cout<<(x+b)%b;
}
posted @ 2019-07-14 16:15  prestige  阅读(123)  评论(0编辑  收藏  举报