Cod sursa(job #359622)

Utilizator proflaurianPanaete Adrian proflaurian Data 27 octombrie 2009 21:23:23
Problema Invers modular Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.62 kb
#include<stdio.h>
#define tip unsigned long long
tip a,n,m,p,e,k;
void read(),solve(),euler(tip p);
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("inversmodular.in","r",stdin);
	freopen("inversmodular.out","w",stdout);
	scanf("%llu%llu",&a,&n);
	if(a==1) for(;;);
}
void solve()
{
	e=1;m=n;euler(2);euler(3);
	for(k=1;;k++)
	{
		p=6*k-1;if(p*p>m)break;euler(p);
		p=6*k+1;if(p*p>m)break;euler(p);
	}
	if(m>1)e*=m-1;
	e--;p=1;
	while(e){if(e%2)p=(p*a)%n;a=(a*a)%m;e/=2;}
	printf("%llu\n",p);
}
void euler(tip p)
{
	if(m%p)return;
	e*=p-1;m/=p;while(m%p==0){e*=p;m/=p;}	
}