[洛谷P1082]同余方程

传送门:同余方程

题意不说了 很水……学完扩欧做的板子题
把ax≡1(modb)转化成一般线性方程ax+by=1
然后扩欧

唯一要注意的是要找最小正整数解,所以搞出来x之后需要乱搞处理一下
然后就没有了
这是一篇很水的题解……关于扩欧走这里:扩展欧几里得学习笔记

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int cnt=0,f=1;char c;
    c=getchar();
    while(!isdigit(c)){
        if(c=='-')f=-f;
        c=getchar();
    }
    while(isdigit(c)){
        cnt=cnt*10+c-'0';
        c=getchar();
    }
    return cnt*f;
}
int a,b,x,y;
void exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;y=0;return;
    }
    exgcd(b,a%b,x,y);
    int z=x;x=y;y=z-y*(a/b);
//    return d; 
}
int main(){
    a=read();b=read();
    exgcd(a,b,x,y);
    if(b<0)b=-b;
    if(x<=0){
        while(x<0)x+=b;
        printf("%d",x);
    }
    else{
        while(x>0)x-=b;
        x+=b; 
        printf("%d",x);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kma093/p/10087253.html