同余方程(扩欧模板)
Posted ppxppx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同余方程(扩欧模板)相关的知识,希望对你有一定的参考价值。
题意:求关于x的同余方程(axequiv1pmod{b})的最小正整数解.
方程(axequiv1pmod{b})有解当且仅当(gcd(a,b)=1).所以方程可写为(a*x+b*y=1),用扩展欧几里得算法求出一组特解(x_0,y_0),通解是所有模b与(x_0)同余的整数,题目要求最小的解,故答案就是((x_0+b)mod b).
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline LL read(){
LL s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
LL exgcd(int a,int b,LL &x,LL &y){
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,y,x);
y-=x*(a/b);
return d;
}
int main(){
LL a=read(),b=read(),x,y;
exgcd(a,b,x,y);
printf("%lld
",(x+b)%b);
return 0;
}
以上是关于同余方程(扩欧模板)的主要内容,如果未能解决你的问题,请参考以下文章