Pagini recente » Borderou de evaluare (job #1187072) | Cod sursa (job #2515401) | Cod sursa (job #2540704) | Cod sursa (job #2999055) | Cod sursa (job #663110)
Cod sursa(job #663110)
#include<stdio.h>
using namespace std;
int nr,x,n,d,n1,r,phi,aux;
int ridic(int a1,int b1)
{
int p2;
p2=1;
while(b1>0)
{
if(b1%2==0)
{
a1=(a1*a1)%r;
b1=b1/2;
}
else
{
p2=(p2*a1)%r;
b1--;
}
}
return p2;
}
int main()
{
freopen("inversmodular.in","r",stdin);
freopen("inversmodular.out","w",stdout);
scanf("%d",&x);
scanf("%d",&n);
n1=n;
aux=n;
d=1;
r=n;
phi=1;
while(d*d<=aux)
{
d++;
nr=0;
while(aux%d==0)
{
aux=aux/d;
nr++;
}
if(nr>0) phi=phi*ridic(d,nr-1)*(d-1);
}
if(aux!=1) phi=phi*(aux-1);
//printf("%d\n",phi);
printf("%d\n",ridic(x,phi-1));
return 0;
}