Pagini recente » Profil Vlad3108 | Cod sursa (job #2912001) | DeehoroEjkoli | Cod sursa (job #871853) | Cod sursa (job #3157130)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");
int mod;
int exp(int n, int p){
if(p == 1) return n;
if(p & 1) return (exp(n,p - 1) * n) % mod;
return (exp(n,p / 2) * exp(n,p / 2)) % mod;
}
int totient(int n){
int d = 3,res = n,p = 0;
if(n % 2 == 0){
while(!(n % 2)){
p++;
n >>= 1;
}
res /= 2;
}
while(n > 1){
if(n % d == 0){
p = 0;
while(!(n % d)){
p++;
n /= d;
}
res *= (d - 1);
res /= d;
}
if(d * d >= n) d = n;
else d += 2;
}
return res;
}
int gcd(int a, int b, int &x, int &y){
if(!b){
x = 1;
y = 0;
return a;
}
int x0,y0;
int d = gcd(b,a % b,x0,y0);
x = y0;
y = x0 - (a / b) * y0;
return d;
}
int invmod1(int n, int m){
int x,y;
int d = gcd(n,m,x,y);
while(y < 0) y += m;
return y;
}
int invmod2(int n, int m){
return exp(n,totient(m) - 1);
}
int main()
{
//cu alg euclid extins
int n,m,x,y,d;
mod = m;
fin >> n >> m;
// fout << invmod1(n,m);
fout << invmod2(n,m);
return 0;
}