d模f的乘法逆元

int Extend_Eulid(int d,int f)
{
    int x1,x2,x3,y1,y2,y3 ;
    x1=1,x2=0,x3=f,y1=0,y2=1,y3=d ;
    while(y3 && y3!=1)
    {
        int q=x3/y3 ;
        int t1,t2,t3 ;
        t1=x1-q*y1,t2=x2-q*y2,t3=x3-q*y3 ;
        x1=y1,x2=y2,x3=y3 ;
        y1=t1,y2=t2,y3=t3 ;
    }
    if(!y3)return -1 ;
    return y2 ;
}
View Code

 a模n的乘法逆元

void gcd(int a,int b,int &d,int &x,int &y){
    if(!b){
        d=a;x=1;y=0;
    }
    else gcd(b,a%b,d,y,x),y-=x*(a/b);
}
int inv(int a,int n){
    int d,x,y;
    gcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}
View Code