Cod sursa(job #3299676)

Utilizator anamaria-carina.orszariAnamaria-Carina Orszari anamaria-carina.orszari Data 9 iunie 2025 08:37:47
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>

#define m 1999999973

using namespace std;

// Fast modular exponentiation
long long mod_pow(long long base, long long exp) {
    long long result = 1;
    base %= m;
    while (exp > 0) {
        if (exp % 2 == 1)
            result = (result * base) % m;
        base = (base * base) % m;
        exp /= 2;
    }
    return result;
}

// Modular inverse using Fermat's little theorem (only if m is prime)
long long mod_inverse(long long n) {
    return mod_pow(n, m - 2);
}

long long exp_log(long long n, int p) {
    if (p < 0) {
        return mod_pow(mod_inverse(n), -p);  // n^(-p) ≡ (n^(-1))^p mod m
    } else {
        return mod_pow(n, p);
    }
}

int main() {
    long long n;
    int p;

    // Use freopen for file input/output
    freopen("lgput.in", "r", stdin);
    freopen("lgput.out", "w", stdout);

    cin >> n >> p;
    cout << exp_log(n, p) << endl;

    return 0;
}