Cod sursa(job #2016904)

Utilizator vladm98Munteanu Vlad vladm98 Data 30 august 2017 20:35:24
Problema Invers modular Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <vector>
using namespace std;
int fv[50001];
int modulo;
vector <int> ciur;
void ciurulet ()
{
    for (int i = 2; i<=50000; ++i)
    {
        if (fv[i] == 0)
        {
            ciur.push_back(i);
            for (int j = i+i; j<=50000; j+=i)
                fv[j] = 1;
        }
    }
}
int putere (long long a, long long b)
{
    long long raspuns = 1;
    a%=modulo;
    while (b)
    {
        if (b%2)
        {
            raspuns = raspuns*a%modulo;
            --b;
        }
        else
        {
            a = a*a%modulo;
            b/=2;
        }
    }
    return raspuns;
}
int main()
{
    ifstream fin ("inversmodular.in");
    ofstream fout ("inversmodular.out");
    long long n, a, fi;
    fin >> a >> n;
    modulo = n;
    fi = n;
    for (auto x:ciur)
    {
        if (n%x == 0)
        {
            fi = fi/x*(x-1);
            while (n%x == 0)
                n/=x;
        }
    }
    fout << putere (a, fi-1);
    return 0;
}