Cod sursa(job #663110)

Utilizator geniucosOncescu Costin geniucos Data 17 ianuarie 2012 20:38:15
Problema Invers modular Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.63 kb
#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;
}