Pagini recente » Cod sursa (job #17936) | Cod sursa (job #642016) | Cod sursa (job #2968629) | Cod sursa (job #452646) | Cod sursa (job #1189303)
#include <stdio.h>
int fi(long long cn)
{
long long i=2,r,n=cn,pp=0;
double put=1,rez=cn;
while(i*i<=cn)
{
int pp=0;
while(cn%i==0)
{
cn/=i;
pp=1;
}
if(pp==1)
{
put=(double)1/(double)i;
rez*=(1-put);
}
i++;
while(cn%i!=0&&i*i<=cn)
i++;
}
if(cn!=1)
{
put=(double)1/(double)2;
rez*=(1-put);
}
r=rez;
if(r==n)
r--;
return r;
}
int put(long long f,long long p,long long n)
{
long long rez=1;
while(p!=0)
{
if(p%2==1)
{
rez*=f%n;
p--;
}
else
{
f*=f%n;
p/=2;
}
}
return rez;
}
int main()
{
freopen("inversmodular.in","r",stdin);
freopen("inversmodular.out","w",stdout);
long long n,cn,a,p;
scanf("%lld%lld",&a,&n);
cn=n;
p=fi(cn);
p--;
p=put(a,p,n);
p%=n;
printf("%I64d",p);
return 0;
}