Pagini recente » Cod sursa (job #3361295) | Cod sursa (job #3363984) | Cod sursa (job #3363710) | Cod sursa (job #3364357) | Cod sursa (job #3364325)
#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;
}