Cod sursa(job #397938)

Utilizator andreirRoti Andrei andreir Data 17 februarie 2010 18:56:27
Problema Ridicare la putere in timp logaritmic Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
/*#include<stdio.h>
#define m 1999999973
int main()
{
	int long long sol=1,n,p;
	freopen("lgput.in","r",stdin);
	freopen("lgput.out","w",stdout);
	
	scanf("%ld %ld",&n,&p);
	
	for(;p!=0;p=p/2)
	{
		if(p%2==1)
			sol=(sol*n) % m;
		n=(n*n)%m;
	}
	printf("%lld",sol);
	return 0;
}
*/ 
#include <stdio.h>
#define m 1999999973


int main()
{
	int i, p,a, sol = 1;

	freopen("lgput.in","r",stdin);
	freopen("lgput.out","w",stdout);
	scanf("%d %d", &a, &p);
	for (i = 0; (1<<i) <= p; ++ i)  // Luam toti biti lui p la rand
	{
		if ( ((1<<i) & p) > 0) // Daca bitul i din p este 1 atunci adaugam n^(2^i) la solutie 
			sol= (sol * a) % m;
	
			a=(a * a) % m; // Inmultim a cu a ca sa obtinem n^(2^(i+1))
	}
	printf("%d\n", sol); // Afisam solutia
}