Cod sursa(job #1128254)

Utilizator jumper007Raul Butuc jumper007 Data 27 februarie 2014 16:17:41
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;

const unsigned long long MOD = 1999999973;

unsigned long long expBySquaring(unsigned long long x, unsigned long long n) {
	if (n == 0) {
		return 1;
	}
	else if (n == 1) {
		return x;
	}
	else if (n % 2 == 0) {
		return (expBySquaring(x*x, n/2));
	}
	else if (n % 2 != 0) {
		return (x * expBySquaring(x*x, (n-1)/2));
	}
}

unsigned long long modular_pow(unsigned long long base, unsigned long long exponent) {
	unsigned long long c = 1;
	for (unsigned long long e_prime = 1; e_prime <= exponent; ++e_prime) {
		c = (c * base) % MOD;
	}
	return c;
}

unsigned long long efficient_modular_pow(unsigned long long base, unsigned long long exponent) {
	unsigned long long result = 1;
	base = base % MOD;
	while (exponent > 0) {
		if (exponent % 2 == 1) {
			result = (result * base) % MOD;
		}
		exponent = exponent >> 1;
		base = (base * base) % MOD;
	}
	return result;
}

int main(int argc, char *argv[]) {
	unsigned long long nr, power;

	fstream in("lgput.in", ios::in);
	in >> nr >> power;
	in.close();

	fstream out("lgput.out", ios::out);
	out << efficient_modular_pow(nr, power);
	out.close();

	return 0;
}