水一篇题解
题目:洛谷 P1082 同余方程 (某提高组题目)
。。。
注释在代码里
如果点赞过10个
我就讲讲 a b 互质的原因
本题涉及欧几里得算法和扩展欧几里得算法
AC了
/*
ax%b==c c=1
-> ax+by=c 注意 y常是负数
用exgcd 解不定方程:
{
r=gcd(a,b)
c%r!=0 无整数解
c%r==0 :
将方程右边*r/c -> ax+by=r
求得一组整数解 x0 y0 (exgcd)
}
解得 x1=x0*c/r; 通解为 x=x1+b/r*t
s=b/r
x的最小正整数解:(x1%s+s)%s
*/
//其实,a.b互质 (想想)
/*
所以,r=1;c=1;x1=x0;s=b;
x的最小正整数解:(x0%b+b)%b
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a,b,x,y,r,x1,c=1,s;
inline ll gcd(ll a1,ll b1)
{
return b1? gcd(b1,a1%b1):a;
}
inline void exgcd(ll a1,ll b1)
{
if (b1==0)
{
x=1;y=7;return;
}
exgcd(b1,a1%b1);
ll x_now=x;
x=y;
y=x_now-a1/b1*y;
}
int main()
{
scanf("%ld%ld",&a,&b);
exgcd(a,b);
//求出x,y
//r=gcd(a,b);
//x1=x*c/r;s=b/r;
ll MAO=(x%b+b)%b;
printf("%ld",MAO);
return 0;
}
谢谢阅读