【ybtoj 高效进阶 6.3】 【同余问题】 同余方程
题目
解题思路
由ax≡1(mod b)可得,ax+by=1
欧几里得定理:gcd(a,b)=gcd(b,a%b)
讨论以下两个式子
ax+by=gcd(a,b)
bx2+(a%b)y2=gcd(b,a%b)
可得ax+by=bx2+(a%b)y2
a%b可看作a-a/b * b
∴ ax+by=bx2+(a-a/b * b)y2
合并同类项ax+by=b(x2-a/b * y2)+ay2
也就是说x=y2,y=x2-a/by2
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long a,b,x,y;
void exgcd(long long a,long long b,long long &x,long long &y)
{
if (b==0)
{
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
long long t=x;
x=y,y=t-a/b*y;
}
int main()
{
scanf("%lld%lld",&a,&b);
exgcd(a,b,x,y);
x=(x+b)%b;
printf("%lld",x);
return 0;
}