Cod sursa(job #1548067)

Utilizator AntoniooMacovei Antonio Antonioo Data 10 decembrie 2015 13:39:02
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
using namespace std;
long long ridicare(long long baza, long long exp, long long n)
{
    long long rez=1;
    baza%=n;
    while(exp!=0)
    {
        if(exp%2==1)
        {
            rez=(rez*(baza%n))%n;
            exp--;
        }
        else
        {
            baza=(baza*baza)%n;
            exp/=2;
        }
    }
    return rez%n;
}
int main ()
{
    freopen("inversmodular.in","r",stdin);
    freopen("inversmodular.out","w",stdout);
    long long a, n, phi, cn, f=2, p=0;
    bool prim=true;
    scanf("%lld%lld",&a,&n);
    phi=n;
    cn=n;
    while(f*f<=n)
    {
        p=0;
        while(n%f==0)
        {
            p++;
            n/=f;
        }
        if(p)
        {
            phi/=f;
            phi*=(f-1);
        }
        f++;
    }
    if(n>1)
    {
        phi/=n;
        phi*=(n-1);
    }
    n=cn;
    printf("%lld",ridicare(a,phi-1,n));
    return 0;
}