Cod sursa(job #1316454)

Utilizator tudorcomanTudor Coman tudorcoman Data 13 ianuarie 2015 20:24:35
Problema Invers modular Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <cmath>
using namespace std;
long long numprimes(long long n)
{
    long long lim=(long long)sqrt((double)n);
    long long ans=n;
    long long div=2;
    while(div*div<=n)
    {
        bool ok = false;
        while(n%div==0)
            n/=div,ok=true;
        if(ok==true)
            ans/=div*(div-1);
        ++div;

    }
    if(n>1)
        ans=ans/n*(n-1);
    return ans;
}
long long lgput (long long a,long long b,long long mod)
{
    if(b==0)
        return 1;
    else
    {
        long long c= lgput(a,b/2,mod);
        if(b&1)
            return c*c%mod*a%mod;
        else
            return c*c%mod;
    }
}
int main()
{
    freopen("inversmodular.in","r",stdin);
    freopen("inversmodular.out","w",stdout);
    long long a,n;
    scanf("%lld%lld",&a,&n);
    printf("%d\n",lgput(a,numprimes(n)-1,n)%n);
    return 0;
}