Cod sursa(job #1342335)

Utilizator RanKBrinduse Alexandru RanK Data 13 februarie 2015 21:02:08
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb

#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>

typedef unsigned long long int64;

int64 logarithmicExponential(int64 n, int64 k, int modulo)
{
	int i = 0;
	int64 p = k;

	// find where the MSB of k is positioned
	for(i=63; i>=0; i--)
	{
		int64 mask = ((int64)1 << i);
		if((k & mask) > 0)
		{
			break;
		}
	}

	int maxPow = i;

	int64 partialResult = 1;
	int64 finalResult = 1;

	for(i=0; i<=maxPow; i++)
	{
		int64 mask = ((int64)1 << i);

		if(i==0)
		{
			partialResult = n;
		}
		else
		{
			partialResult *= partialResult;
		}
		
		if(modulo != 0)
		{
			partialResult %= modulo;
		}

		if(k & mask)
		{
			finalResult *= partialResult;
		}

		if(modulo != 0)
		{
			finalResult %= modulo;
		}
	}

	return finalResult;
}

int main()
{
	freopen("lgput.in", "r", stdin);
	freopen("lgput.out", "w", stdout);

	int n, p;

	scanf("%d %d", &n, &p);
	int64 res = logarithmicExponential((int64)n, (int64)p, 1999999973);

	printf("%llu\n", res);

	return 0;
}