扩展GCD&同余方程&乘法逆元

扩展欧gcd

已知:ax+by = gcd(a,b),求出一组特解,x0,y0。其他解为:x=x0+k*b; y=y0-k*a;

对于更为一般的方程ax+by = c,它有解当且仅当d|c(d=gcd(a,b))。

通解:x = (c/d)*x0+k*(b/d) , y = (c/d)*y0 - k*(a/d)。(k∈Z)。

最小正整数解:x1 = ((x0*c/d)%(b/d)+(b/d))%(b/d)。

用途:求乘法逆元,不定方程,线性同余方程。

代码:

long long exgcd(long long a, long long b, long long &x, long long &y){
    if(b == 0){ x = 1,y = 0;return a; }
    long long d = exgcd(b , a%b, x, y);
    long long z = x; x =y; y = z - y * (a/b);
    return d;
}

线性同余方程

同余:a,b模m同余,记为a≡b(mod m).

线性同余方程:a*x≡c(mod b).(未知数指数为1故叫一次同余方程也称线性同余方程)。等价于 a*x - c 是 b的倍数,设为-y倍

即 a*x + b*y = c.当且仅当gcd(a,b)整除c有解。

解题步骤:

1、化简方程为一次同余方程标准式:ax≡b(mod n);

2、利用d = exgcd(a,b,x,y)求线性同余方程ax + by = gcd(a,b)的解x0以及公式 x1 = x0*c/d求出原方程ax+by=c 的解x1;前提是d|c.

3、最小非负整数解 公式:x1 = (x1 % (b/d) + (b/d) ) % (b/d);

若方程的ax + by = c 的一组整数解为(x1 , y1),则它的任意整数解为(x1 + k * (b/d) , y1 - k * (a/d) ) ( k取任意整数 ), T = b/d就为 x1 增长的周期;

乘法逆元:

满足a*x≡1 (mod p)的x值(gcd(a,p)=1)

通俗理解:(1/a)mod p 和 (a的逆元)mod p一样

作用:求(a/b)%p,当a过大,导致a/b无法直接求得时可以先求b对p的逆元x(b%p与b对p的逆元是一样的),再乘(a%p)=n,即

(n*x)%p和(a/b)%p结果是一样的

求法:

a*x≡1 (mod p)

a*x%p = 1

ax = yp +1

ax - yp = 1

gcd(a,p)= 1,用exgcd()求x最小正整数解

代码:

long long inverse(long long num,long long mod)  
{  
    long long x,y;  
    exgcd(num,mod,x,y);  
    while(x<0) x+=mod,y-=num;  
    return x;  
} 

 

例题:

hdu2104 http://acm.hdu.edu.cn/showproblem.php?pid=2104

hdu2669 http://acm.hdu.edu.cn/showproblem.php?pid=2669

hdu1576 http://acm.hdu.edu.cn/showproblem.php?pid=1576

poj1061 http://poj.org/problem?id=1061

poj2115 http://poj.org/problem?id=2115

题解:https://blog.csdn.net/q451792269/article/details/78008179

poj2891 http://poj.org/problem?id=2891

poj1845 http://poj.org/problem?id=1845

ch3301

猜你喜欢

转载自blog.csdn.net/TernYoung/article/details/89068393