Cod sursa(job #1189303)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 22 mai 2014 10:25:27
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
int fi(long long cn)
{
    long long i=2,r,n=cn,pp=0;
    double put=1,rez=cn;
    while(i*i<=cn)
    {
        int pp=0;
        while(cn%i==0)
        {
            cn/=i;
            pp=1;
        }
        if(pp==1)
        {
            put=(double)1/(double)i;
            rez*=(1-put);
        }
        i++;
        while(cn%i!=0&&i*i<=cn)
            i++;
    }
    if(cn!=1)
    {
        put=(double)1/(double)2;
        rez*=(1-put);
    }
    r=rez;
    if(r==n)
        r--;
    return r;
}
int put(long long f,long long p,long long n)
{
    long long rez=1;
    while(p!=0)
    {
        if(p%2==1)
        {
            rez*=f%n;
            p--;
        }
        else
        {
            f*=f%n;
            p/=2;
        }
    }
    return rez;
}
int main()
{
    freopen("inversmodular.in","r",stdin);
    freopen("inversmodular.out","w",stdout);
    long long n,cn,a,p;
    scanf("%lld%lld",&a,&n);
    cn=n;
    p=fi(cn);
    p--;
    p=put(a,p,n);
    p%=n;
    printf("%I64d",p);
    return 0;
}