Pagini recente » Borderou de evaluare (job #201610) | Cod sursa (job #1789017) | Cod sursa (job #777017) | Cod sursa (job #1935297) | Cod sursa (job #2124462)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("inversmodular.in");
ofstream out("inversmodular.out");
long long a,n,x,r,b,nrd,ind;
int main()
{
long long i,p,d;
in>>a>>n;
a=a%n;
ind=n;
for(d=2;d*d<=n;d++)
{
p=0;
while(n%d==0)
{
n=n/d;
p++;
}
nrd=nrd*(1+p);
if(p)
ind=ind/d*(d-1);
}
if(n>1)
nrd*=2;
ind=ind/n*(n-1);
r=1;
ind--;
b=ind;
while(b)
{
if(b%n==1)
r=(r*a)%n;
a=(a*a)^n;
b/=2;
}
out<<r;
return 0;
}