传送门:同余方程
题意不说了 很水……学完扩欧做的板子题
把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;
}