Cod sursa(job #1459626)

Utilizator zvonTutuldunsa Voronokda zvon Data 10 iulie 2015 13:45:19
Problema Ridicare la putere in timp logaritmic Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#define MOD 1999999973

using namespace std;

int ridicare(long long n, long long p) {
    if (p == 0)
        return 1;
    else if (p == 1)
        return n;
    else
        if (p % 2 == 0)
            return ridicare(n * n, p / 2);
        else
            return n * ridicare(n * n, p / 2);
}

int ridicare2(int n, int p) {
    int y = 1;
    while (p > 1) {
        if (p % 2 == 0) {
            n = ((n % MOD) * (n % MOD)) % MOD;
            p = p / 2;
        } else {
            y = ((y % MOD) * (n % MOD)) % MOD;
            n = ((n % MOD) * (n % MOD)) % MOD;
            p = p / 2;
        }
    }
    return ((y % MOD) * (n % MOD)) % MOD;
}

int ridicare3(int n, int p) {
    int rez = 1;
    for (int i = 0; i < p; i++) {
        rez = ((rez % MOD) * (n % MOD)) % MOD;
    }
    return rez;
}

int ridicare4(int n, int p) {
    int r = 1;
    while (p) {
        if (p % 2 == 1) {
            r *= n;
            p--;
        }
        n *= n;
        p /= 2;
    }
    return r;
}

int main() {
    long long n;
    long long p;
    ifstream fi("lgput.in");
    ofstream fo("lgput.out");

    fi >> n >> p;
    fo << ridicare(n, p);
    fi.close();
    fo.close();
    return 0;
}