Elemento inverso-aplicación del elemento inverso multiplicativo

Elemento inverso-aplicación del elemento inverso multiplicativo

1. Introducción al problema:
(1) Para el problema de m = (a / b) (mod p), dado que la división no puede usar el teorema de congruencia, necesitamos convertir la división en multiplicación
(a / b)% p = a * inv (b , p)% p = (a% p * inv (b, p)% p)% p
(donde v (b, p) es el inverso multiplicativo de b en el sentido de mod p)
O:
(2) Cuando Se requiere el valor de (a / b) mod p, y a es tan grande que se desbordará; ob es tan grande que aumentará la precisión. Cuando el valor de a / b no se puede obtener directamente, necesitamos usar el elemento inverso multiplicativo.

2. Definición:
Si hay ab≡1 (modp), entonces b es el inverso multiplicativo de a en el sentido de mod p. Recuerde b = inv (a) o b = a ^ -1

3. Propiedades:
cada número a tiene un elemento inverso multiplicativo único x que le corresponde, de modo que ax≡1 (mod p), la condición necesaria y suficiente para que un número tenga un elemento inverso es mcd (a, p) = 1, esto Solo existe el elemento inverso de tiempo.
En el sentido de módulo p, si un número a tiene un elemento inverso x, entonces dividir por a equivale a multiplicar por x .

4. Resolver el
método de Euclides extendido del elemento inverso :

#include<bits/stdc++.h>
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
    
    
    if(b==0)
    {
    
    
        x=1,y=0;
        return a;
    }
    int r = exgcd(b,a%b,x,y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return r;
}
int inv(int n,int mod)///求n在模mod的情况下的逆元
{
    
    
    int x,y;
    int ans = exgcd(n,mod,x,y);
    if(ans == 1)
        return (x%mod+mod)%mod;
    else
        return -1;
}
int main()
{
    
    
    int n,mod;
    cin>>n>>mod;
    int ans = inv(n,mod);
    if(ans==-1)
        cout<<"没有逆元"<<endl;
    else
        cout<<"逆元为:"<<ans<<endl;
    return 0;
}


Pregunta de ejemplo: enlace de pregunta hdu1576 : http://acm.hdu.edu.cn/showproblem.php?pid=1576

Pregunta original:
se requiere (A / B)% 9973, pero como A es muy grande, solo damos n (n = A% 9973) (damos A debe ser divisible por B, y mcd (B, 9973) = 1).

Código AC:

#include<bits/stdc++.h>
using namespace std;

const int mod=9973;

int exgcd(int a,int b,int &x,int &y)
{
    
    
    if(b==0)
    {
    
    
        x=1,y=0;
        return a;
    }
    int r = exgcd(b,a%b,x,y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return r;
}
int inv(int n,int mod)///求n在模mod的情况下的逆元
{
    
    
    int x,y;
    int ans = exgcd(n,mod,x,y);
    if(ans == 1)
        return (x%mod+mod)%mod;
    else
        return -1;
}
int main()
{
    
    
    int t,b,n;
    cin>>t;
    while(t--)
    {
    
    
        cin>>n>>b;
        int ans=inv(b,mod);
        cout<<(n%mod*(ans%mod))%mod<<endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_40534166/article/details/99706015
Recomendado
Clasificación