Cod sursa(job #1943544)

Utilizator AkrielAkriel Akriel Data 28 martie 2017 17:38:23
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

#define type long long int

using namespace std;

ifstream fin ("inversmodular.in");
ofstream fout ("inversmodular.out");

type number, modulo, power = 1, inversModular, mask;

bool prime(type checkNumber){
    if ( checkNumber == 0 or checkNumber == 1 )
        return false;
    if ( checkNumber == 2 )
        return true;
    for ( int index = 2; index*index <= checkNumber; index++ )
        if ( checkNumber%index == 0 )
            return false;
    return true;
}

type risingPower(type base, type exponent){
    type product = 1;
    for ( ; exponent; exponent >>= 1 ){
        if ( exponent % 2 )
            product = (product * base) % mask;
        base = (base*base) % mask;
    }
    return product;
}

int main(){
    fin >> number >> modulo;
    mask = modulo;
    if ( prime(modulo) == 1 )
        inversModular = risingPower(number, modulo-2);
    else{
        for ( int index = 2; index*index <= modulo; index++ ){
            if ( modulo % index == 0 ){
                power *= (index-1);
                while ( modulo % index == 0 ){
                    power *= index;
                    modulo /= index;
                }
                power /= index;
            }
        }
        if ( modulo > 0 and modulo != 1 )
            power *= (modulo-1);
        inversModular = risingPower(number, power-1);
    }
    fout << inversModular;
}