Cod sursa(job #614420)

Utilizator david_raucaRauca Ioan David david_rauca Data 6 octombrie 2011 15:14:58
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<fstream>
using namespace std;
 
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");

int n;

int F(int q);
int Putere( int a, int b );
 
int main()
{
    int a;
    fin >> a >> n;
     
    fout << Putere(a, F(n)-1 );
    //fout << ' ' << F(n);
     
    fin.close();
    fout.close();
     
    return 0;
}
 
int F( int q )
{
    int n1 = q;
    for( int i = 2; i*i <= q; ++i )
    {
         if( q % i == 0 )
             n1 = n1 / i * ( i - 1 );
              
         while( q % i == 0 )
                q /= i;      
    }
     
    if( q != 1 )
        n1 = n1 / q * ( q-1);
     
    return n1;
}
 
int Putere( int a, int b )
{
    if( b == 0 )
        return 1;
     
    if( b % 2 == 0 )
        return Putere( ((long long)a*(long long)a)%n, b/2 )%n;
    else
        return ((long long)a*Putere( ((long long)a*(long long)a)%n, b/2 ))%n;
}