Cod sursa(job #3364325)

Utilizator and_Turcu Andrei and_ Data 1 septembrie 2026 18:27:45
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MOD = 1999999973;

int inmultire(int x, int y)
{
    return (1LL * x * y) % MOD;
}


/////  return baza ^ exp
//int ExponetiereRapida(int baza, int exp)
//{
//    if(exp == 1)
//        return baza;
//
//    if(exp % 2 == 0)
//    {
//        int aux = ExponetiereRapida(baza, exp / 2);
//        return aux * aux;
//    }
//    else
//        return baza * ExponetiereRapida(baza, exp - 1);
//}

///  return baza ^ exp
int ExponetiereRapida(int baza, int exp)
{
    if(exp == 1)
        return baza;

    if(exp % 2 == 0)
    {
        int aux = ExponetiereRapida(baza, exp / 2);
        return inmultire(aux, aux);
    }
    else
        return inmultire(ExponetiereRapida(baza, exp - 1), baza);
}

//int ExponetiereRapidaIterativa(int baza, int exp)
//{
//    int raspuns = 1;
//
//    while(exp > 0)
//    {
//        if(exp % 2 == 1)
//        {
//            raspuns *= baza;
//            exp --;
//        }
//        else
//        {
//            baza = baza * baza;
//            exp /= 2;
//        }
//    }
//
//    return raspuns;
//}

int ExponetiereRapidaIterativa(int baza, int exp)
{
    int raspuns = 1;

    while(exp > 0)
    {
        if(exp % 2 == 1)
        {
            raspuns = inmultire(baza, raspuns);
            exp --;
        }
        else
        {
            baza = inmultire(baza, baza);
            exp /= 2;
        }
    }

    return raspuns;
}


int main()
{
    int x, p;

    fin >> x >> p;


/*
    int raspuns = 1;

/// Solutia Bruta: Complexitate: O(P)
    for(int i = 1; i <= p; i++)
        raspuns = 1LL * (1LL * raspuns * x) % MOD;

    fout << raspuns;

*/

/// Exponentiere rapida: Complexitate O(log N)

/// Versiune recursiva
//    fout << ExponetiereRapida(x, p);

/// Versiune iterativa
    fout << ExponetiereRapidaIterativa(x, p);

    return 0;
}