Mai intai trebuie sa te autentifici.
Cod sursa(job #3190204)
Utilizator | 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
*/