@ysner
2018-07-22T22:06:00.000000Z
字数 1587
阅读 2938
数论
求解形如的最小正整数解。
il void exgcd(re ll A,re ll B,re ll &D,re ll &x,re ll &y)
{
if(!B) x=1,y=0,D=A;
else exgcd(B,A%B,D,y,x,c),y-=(A/B)*x;
}
il void solve2()
{
re ll A=atk[1],B=a[1],M=p[1],D,x,y,ysn,zsy;
exgcd(A,M,D,x,y);//D=gcd(A,M)
if(B%D) {puts("-1");return;}
x=x*(B/D)%(M/D);
printf("%lld\n",x);
}
解释一下:
(正负号不重要)
于是就是解这个不定方程。
根据斐蜀定理:
所以必须,否则无解。
设。
当,所以此时
当时,设
根据欧几里德原理,则
即
对应得
于是我们就可以一边求一边解这个方程。
当然,注意到跑了后解出来的是
解同时乘上即可。
注意到的解不止一个,后总是合法。(因为加减的都是)。
为了求最小正整数值,我们模这个值即可。
如果要把最后一步套路化,就是
用中国剩余定理(孙子定理)解决。
讲这玩意儿需要栗子。
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以余),五五数之剩三(除以余),七七数之剩二(除以余),问物几何?”
首先,我们假设是满足除以余的一个数。同样,我们假设是满足除以余的一个数,是满足除以余的一个数。
现在把作为该问题最终解。
则依“两数相加则模数相加”:
所以,孙子问题解法的本质是对每一个方程,从其它所有模数公倍数中找出符合该方程的解,最终解就是这些解相加。
在求,,时又用了一个小技巧,以为例,并非从和的公倍数中直接找一个除以余的数,而是先找一个除以余的数,再乘以。也就是找解时先求出公倍数模数下的逆元,再用逆元去乘余数。
找逆元和解单个同余方程一样。
用拓展中国剩余定理解决。
还是栗子。
有一同余方程组:(注意到没有系数)
则
发现右边两个表达式相等可以看做一个方程
显然可以拓欧求解。
又由斐蜀定理可知,
所以
将代入即可得出特解
如果解出特解,则。
则
这个方程的解就是整个方程组的解。