Cod sursa(job #3298917)

Utilizator robertcd29Chira Robert-Denis robertcd29 Data 3 iunie 2025 01:59:42
Problema Invers modular Scor 50
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>

int inv_modular(unsigned long long n) {
    unsigned long long rez = n;
    for (unsigned long long d = 2 ; d < n * n; d++) {
            if (n % d == 0)
            {
                while(n % d == 0)
                {
                    n = n / d;
                    rez = rez - rez / d;
                }
            }
        }
    if(n>1)
        rez = rez - rez / n;
    return rez;
}

unsigned long long exp_long(unsigned long long a, unsigned long long p, unsigned long long n) {
    unsigned long long rez = 1;
    a = a % n;
    while(p > 0)
    {
        if(p % 2 == 1)
            rez = (rez * a) % n;
        
        a = (a * a) % n;
        p = p / 2;
    }
    return rez;
}

int main(void)
{
    FILE *fin = NULL;
    FILE *fout = NULL;
    if((fin = fopen("inversmodular.in", "r")) == NULL) {
        fprintf(stderr, "Eroare la deschidere\n");
        return 1;
    }

    if((fout = fopen("inversmodular.out", "w")) == NULL) {
        fprintf(stderr, "Eroare la deschidere\n");
        fclose(fin);
        return 1;
    }

    unsigned long long a, n;

    fscanf(fin, "%llu %llu", &a, &n);

    unsigned long long p = inv_modular(n) - 1;
    unsigned long long rez = exp_long(a, p, n);
    fprintf(fout, "%llu\n", rez);


    fclose(fin);
    fclose(fout);



    return 0;
}