题目大意:
题目链接:https://www.luogu.org/problem/P1082
求关于x的同余方程ax≡1(modb)的最小正整数解。
思路:
数论是真的差,现在才来补qwq。
我先把原式改写为等式的形式。
ax≡1(modb)
ax−by=1
然后设x′y′为方程bx′−(amodb)y′=1的一组解。
即为bx′−y′(a−⌊ba⌋)的一组解。
统一格式为
ay′−b(x′−by′a)
那么代入x=y,y=x′−by′a即可。
因为gcd(x,0)=x,当b=0时,必然有a=1。此时该方程的解为x=1,y=0。
然后往上回溯求解即可。
最终我们可以得到该方程的一组解(x,y),由于要求x尽量小且大于0,我们发现为了满足ax+by=1,Δax必然等于Δby,那么同时要满足x,y均为整数,所以需要找到一组合法的(x′,y′)使得a(x±x′)=b(y±y′)。
所以Δax和Δby最小等于lcm(a,b)。所以Δx每次最小为lcm(a,b)b。
那么就让x不停加减lcm(a,b)b,知道x为最小的正整数解为止。其实不断加减就是进行一次取模运算即可。
代码:
#include <cstdio>
#include <algorithm>
#define mp make_pair
#define st first
#define nd second
using namespace std;
int a,b;
pair<int,int> exgcd(int a,int b)
{
if (b)
{
pair<int,int> x=exgcd(b,a%b);
return mp(x.nd,x.st-x.nd*(a/b));
}
return mp(1,0);
}
int main()
{
scanf("%d%d",&a,&b);
int x=exgcd(a,b).first,y=b/__gcd(a,b);
printf("%d",(x%y+y)%y);
return 0;
}