Cod sursa(job #3133939)

Utilizator cristina_ovidiuCristina Ovidiu Lucian cristina_ovidiu Data 27 mai 2023 17:58:11
Problema Invers modular Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint64_t n;

uint64_t phi(uint64_t n)
{
    uint64_t r = n , d = 2;
    while(n > 1)
    {
        if(n % d == 0)
        {
            r = r / d * (d - 1);
            while(n % d == 0)
                n /= d;
        }
        d ++;
        if(d * d > n)
            d = n;
    }
    return r;
}

uint64_t eul(uint64_t n){
    uint64_t ans = n;
    uint64_t j = 2;
    while(n > 1){
        if(n % j == 0){
            ans *= 1 - 1.0f/j;
            while(n % j == 0){
                n /= j;
            }
        }
        ++j;
    }
    return ans;
}

int phiFunction(int n) {
    int result = n; // Initialize result as n

    // Find all prime factors of n
    for (int p = 2; p * p <= n; ++p) {
        if (n % p == 0) {
            // p is a prime factor of n
            while (n % p == 0) {
                n /= p;
            }
            // Reduce result using the formula: result = result * (1 - 1/p)
            result -= result / p;
        }
    }

    // If n has a prime factor greater than sqrt(n)
    if (n > 1) {
        result -= result / n;
    }

    return result;
}

uint64_t pw(uint64_t x,uint64_t e){
    uint64_t ans = 1, p = x;
    while(e){
        if(e & 1){
            ans = (ans * p) % n;
        }
        p = (p * p) % n;
        e >>= 1;
    }
    return ans;
}

int main(){
    freopen("inversmodular.in","r",stdin);
    freopen("inversmodular.out","w",stdout);
    uint64_t a;
    scanf("%llu %llu",&a,&n);
    printf("%llu",pw(a,eul(n) - 1));
    return 0;
}