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;
}