Mai intai trebuie sa te autentifici.

Cod sursa(job #3190204)

Utilizator BoggiGurau Bogdan Boggi Data 7 ianuarie 2024 11:07:39
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("lgput.in");
ofstream fout("lgput.out");

const int MOD = 1999999973;

long long baseAtPower(long long base, long long power) {
    if (power == 0) {
        return 1;
    } if (power % 2 == 1) {
        return base * baseAtPower(base * base % MOD, power / 2) % MOD;
    }
    return baseAtPower(base * base % MOD, power / 2) % MOD;
}

int main() {
    long long base, power;
    fin >> base >> power;
    fout << baseAtPower(base, power);
}
/*
daca pow % 2 == 1 b*(b^2)^p-1/2
== 0 b^2)p/2

Idee:
2^5 = 2 * 2 ^ 4 = 2* (2^2) * (2^2) = 2 * (2^1) * (2^1)
5 1
2 0
1 1
101 ->
p = 1
1 1 -> R = 2, P = 2
2 0 -> R =2, P = 4
5 1 -> R = 4, P = 8
LA FINAL:
4 * 8 = 32= 2 ^ 5


parametrii baza, putere, rezultat, patrat
Conditie de oprire: cand puterea e == 0 returnam 1;
Apelam functia pentru baza, putere/2
patratul il inmultim cu el insusi
returnam patratul
daca rest == 1 rez global *= baza
returnam
*/