Cod sursa(job #1357654)

Utilizator japjappedulapPotra Vlad japjappedulap Data 24 februarie 2015 01:00:34
Problema Invers modular Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <stack>
using namespace std;

ifstream is ("inversmodular.in");
ofstream os ("inversmodular.out");

long long a, MOD, x;
long long POW(long long A, long long B);
long long InvMod(long long A, long long B);
long long getphi(long long nr);

int main()
{
    is >> a >> MOD;
    MOD = getphi(MOD) + 1;
    os << POW(a, MOD-2);
    is.close();
    os.close();
    return 0;
}

long long POW(long long A, long long B)
{
    stack <int> S;
    long long aux = B;
    for (; aux; aux /= 2) S.push(aux % 2);
    for (aux = 1; !S.empty(); S.pop())
    {
        aux = ( 1LL * aux * aux) % MOD;
        if (S.top() == 1) aux = (1LL * aux * A) % MOD;
    }
    return aux % MOD;
};

long long getphi(long long nr)
{
    long long cur = nr;
    for(long long i = 2;i * i <= nr; ++i)
    {
        if (nr % i == 0)
        {
            while(nr % i == 0)nr /= i;
            cur = (cur / i) * (i - 1);
        }
    }
        if (nr != 1) cur = cur / nr * (nr - 1);
    return cur;
};