Pagini recente » Cod sursa (job #636622) | Cod sursa (job #3037306) | Cod sursa (job #404184) | Cod sursa (job #471661) | Cod sursa (job #2517997)
#include <bits/stdc++.h>
using namespace std;
ifstream in("inversmodular.in");
ofstream out("inversmodular.out");
int a,n;
int coprime(int nr)
{
int fact[101],nrFact[101],t=0;
int sum=1;
int radNr=sqrt(nr);
for(int d=2;d<=radNr && nr!=1;d++)
if(nr%d==0)
{
fact[++t]=d;
nrFact[t]=0;
while(nr%d==0)
{
nrFact[t]++;
nr/=d;
}
}
if(nr!=1)
{
fact[++t]=nr;
nrFact[t]=1;
}
for(int i=1;i<=t;i++)
sum*=(int)(pow(fact[i],nrFact[i]-1)+0.5)*(fact[i]-1);
return sum;
}
int logpow(int a,int p)
{
int rez=1,inm=a;
while(p)
{
if(p%2)
rez=(rez*inm)%n;
p/=2;
inm=(inm*inm)%n;
}
return rez;
}
int main()
{
in>>a>>n;
int p=coprime(n);
int rez=logpow(a,p-1);
out<<rez;
return 0;
}