Cod sursa(job #1316446)

Utilizator tudorcomanTudor Coman tudorcoman Data 13 ianuarie 2015 20:21:57
Problema Invers modular Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <cmath>
using namespace std;
int numprimes(int n)
{
    int lim=(int)sqrt((double)n);
    int ans=n;
    for(int i=2; i<=lim; ++i)
    {
        bool ok=false;
        while(n%i==0)
        {
            n/=i;
            ok=true;
        }
        if(ok)
        {
            ans/=i;
            ans*=(i-1);
            lim=(int)sqrt((double)n);
        }
    }
    if(n>1)
        ans=ans/n*(n-1);
    return ans;
}
int lgput (int a,int b,int mod)
{
    if(b==0)
        return 1;
    else
    {
        int 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);
    int a,n;
    scanf("%d%d",&a,&n);
    printf("%d\n",lgput(a,numprimes(n)-1,n)%n);
    return 0;
}