Cod sursa(job #282423)

Utilizator tomescu_alinTomescu Alin tomescu_alin Data 17 martie 2009 17:20:24
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;

typedef unsigned char byte;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned long long ulonglong;

#define NDEBUG

#ifdef NDEBUG
#define dbg	0 && (*((ostream *) 0))
#else
#define dbg clog
#endif

namespace Math {
	
	long pow(long x, long n)
	{
	    long result = 1;
	    while ( n ) {
	        if ( n & 1 ) {
	            result *= x;
	        }
	        x *= x;
	        n /= 2;
	    }
	    return result;
	}
	
	ulonglong pow_modulo(ulonglong x, ulonglong n, ulonglong mod) {
		ulonglong result = 1;
	    while(n) {
	        if(n & 1) {
	            result = (result * x) % mod;				
	        }
	        x = (x * x) % mod;
	        n = n >> 1;
	    }
	    return result;
	}
}

int main(int argc, char * argv[]) {
	
	const char * inFile = "lgput.in";
	const char * outFile = "lgput.out";
	
	ifstream fin(inFile);
	ofstream fout(outFile);
	
	#ifndef NDEBUG
		if(!fin || !fout) {
			cerr << "Error opening one of \"" << inFile << "\" or \"" << outFile << "\"" << endl;
			return -1;
		}
	#endif
	
	const ulong mod = 1999999973;
	// Do ya thing
	ulong x, n;
	fin >> x >> n;
	
	fout << Math::pow_modulo(x, n, mod) << endl;
	
	fout.close();
	fin.close();
	
	return 0;

}