OI模板-gcd/逆元/同余
long long!
gcd
inline int gcd(int a, int b){ return (b ? gcd(b, a%b) : a); }
 
exgcd
求解 a x + b y = 1 ax + by = 1 ax+by=1 的可行解。
inline void exgcd(int &x, int &y, int a, int b){
	if(!b){ x = 1, y = 0; return; }
	exgcd(x, y, b, a%b);
	int z = x; x = y; y = z - a / b * y;
}
 
对于 a x ≡ 1 ( m o d b ) ax\equiv1(\bmod~b) ax≡1(mod b) 的形式,可以转化为 a x + b y = 1 ax+by=1 ax+by=1 进行求解,解出特解 x 0 x_0 x0,通解即为 x 0 + k b x_0+kb x0+kb,最小正整数解 x m i n Z + = ( x 0 m o d b + b ) m o d b x_{min\Bbb{Z^+}}=(x_0\bmod b+b)\mod b xminZ+=(x0modb+b)modb。
裴蜀定理
    
     
      
       
        a
       
       
        x
       
       
        +
       
       
        b
       
       
        y
       
       
        =
       
       
        c
       
      
      
       ax+by=c
      
     
    ax+by=c (
    
     
      
       
        x
       
       
        ,
       
       
        y
       
      
      
       x,y
      
     
    x,y 为正整数)成立的充要条件是 
    
     
      
       
        g
       
       
        c
       
       
        d
       
       
        (
       
       
        a
       
       
        ,
       
       
        b
       
       
        )
       
       
        ∣
       
       
        c
       
      
      
       gcd(a,b)|c
      
     
    gcd(a,b)∣c。显然
有理数取余
求解 x ≡ a b ( m o d p ) x \equiv \displaystyle\frac ab~(\bmod~p) x≡ba (mod p)。
- 两边同乘 b b b 得 b x ≡ a ( m o d p ) bx \equiv a~(\bmod~p) bx≡a (mod p)。
 - 用 exgcd \texttt{exgcd} exgcd 求得一 x 1 x_1 x1 使得 b x 1 ≡ 1 ( m o d p ) bx_1 \equiv 1~(\bmod~p) bx1≡1 (mod p)
 - 所以 b × ( a x 1 ) ≡ a ( m o d p ) b\times(ax_1) \equiv a~(\bmod~p) b×(ax1)≡a (mod p)。
 - 此时 a x 1 m o d p ax_1 \bmod p ax1modp 即为答案。
 - (当 b m o d p = 0 b \bmod p = 0 bmodp=0 时无解)
 
int getmod(int a, int b, int p){//要满足 a < p, b < p(不满足取mod)
	if(b % p == 0) return -1;
	int x, y; exgcd(x, y, b, p);
	long long ans = a * (long long)((x + p) % p) % p;
	return (int)ans;
}
 
逆元
费马小定理
a x ≡ 1 ( m o d p ) ax\equiv1~(\bmod~p) ax≡1 (mod p) 则 x ≡ a p − 2 ( m o d p ) x\equiv a^{p-2}~(\bmod~p) x≡ap−2 (mod p),快速幂求解。(仅限 p p p 为质数)
exgcd
    
     
      
       
        a
       
       
        x
       
       
        ≡
       
       
        1
       
       
         
       
       
        (
        
       
        
         m
        
        
         o
        
        
         d
        
        
       
         
       
       
        p
       
       
        )
       
      
      
       ax\equiv1~(\bmod~p)
      
     
    ax≡1 (mod p) 则有整数 
    
     
      
       
        k
       
      
      
       k
      
     
    k 使得 
    
     
      
       
        a
       
       
        x
       
       
        +
       
       
        p
       
       
        k
       
       
        =
       
       
        1
       
      
      
       ax+pk=1
      
     
    ax+pk=1,exgcd 求解。(仅限 
     
      
       
        
         x
        
        
         ⊥
        
        
         p
        
       
       
        x\perp p
       
      
     x⊥p 但这个不满足的话就没有逆元了)
int getinv(int x, int p){
	int a, k;
	exgcd(a, k, x, p);
	return (a % p + p) % p;
}
 









