Cod sursa(job #1495814)

Utilizator lorundlorund lorund Data 3 octombrie 2015 17:39:26
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <cstdio>
#include <cstdint>
#include <utility>

std::pair<int64_t, int64_t> gcd(int64_t a, int64_t b){
    int32_t s[3]={1}, t[3]={0, 1};
    int64_t q, r;

    while (b){
        q = a/b;
        r = a%b;

        s[2] = s[0]-q*s[1];
        t[2] = t[0]-q*t[1];

        s[0]=s[1], t[0]=t[1], a=b;
        s[1]=s[2], t[1]=t[2], b=r;
    }

    return std::make_pair(s[0], t[0]);
}

int64_t pinv(int64_t a, int64_t b){
    int64_t sol = gcd(a, b).first;

    while (sol<0) sol += b;

    return sol;
}

int main()
{
    int a, b;

    freopen("inversmodular.in", "r", stdin);
    freopen("inversmodular.out", "w", stdout);

    scanf("%d %d", &a, &b);
    printf("%lld", pinv(a, b));
    return 0;
}