rearanjat, și împărțit pe limbaje, redenumit

This commit is contained in:
2026-02-27 20:55:36 +02:00
parent 9d65b1e00c
commit 56ae1f8488
21 changed files with 661 additions and 26 deletions
+61
View File
@@ -0,0 +1,61 @@
// 2. Divide et Impera (2 pct)
// Se dau trei numere întregi x, n și M.
// Să se calculeze eficient valoarea expresiei x^n % M folosind
// metoda Divide et Impera. Algoritmul trebuie să aibă o complexitate
// de O(log n). Atenție la gestionarea overflow-ului în timpul înmulțirilor.
// Exemplu:
// • Input: x = 2, n = 10, M = 1000
// • Output: 1024 (mod 1000) = 24
// • Input: x = 4, n = 13, M = 497
// • Output: 67108864 (mod 497) = 445
#include<iostream>
int putereMoo(int b, int e, int M){
int rezultat = 1;
b = b-(b/M)*M; //b = b%M
while (e > 0 && M!=0){
if (e % 2 == 1){
int aux1 = rezultat*b;
rezultat = aux1-(aux1/M)*M;
}
e = e/2;
int aux2 = b*b;
b = aux2-(aux2/M)*M;
}
return rezultat;
}
int putere(int b, int e){
if (e == 0) {
return 1;
}
else if (e == 1) {
return b;
}
else if (e % 2 == 0) {
return putere(b, e/2) * putere(b, e/2);
}
else return putere(b,e/2+1) * putere(b,e/2);
// complexitate O(n) pentru ca apeleaza functia de doua ori per nivel, si functia
// imparte e in 2 dar fiind apelata de doua ori e de fapt 2 la puterea log in baza
// 2 din n, deci O(n).
}
int putereMod(int x, int n, int M){
return putere(x,n) % M; // O(1)
}
int main(){
int x,n,M;
std::cin >> x;
std::cin >> n;
std::cin >> M;
int rezultat;
rezultat = putereMod(x, n, M);
std::cout << rezultat << std::endl;
rezultat = putereMoo(x,n,M);
std::cout << rezultat << std::endl;
return 0;
}