Cod sursa(job #789078)

Utilizator f.v.antonFlavius Anton f.v.anton Data 16 septembrie 2012 17:58:14
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.72 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MOD 1999999973

int main()
{
	long long int N, N1, N2;
	int P, i, start = 0; /* Montgomery start. We need the first 1 */
	FILE *f = fopen("lgput.in", "rt");
	FILE *g = fopen("lgput.out", "wt");

	fscanf(f, "%lld %d", &N, &P);

	N1 = N % MOD;
	N2 = ((N % MOD) * (N % MOD)) % MOD;

	for(i = 8*sizeof(int) - 1; i >= 0; i--) {
		if ((P >> i) & 1) {
			if (!start) {
				start = 1;
				continue;
			}
			else {
				N1 = ((N1 % MOD) * (N2 % MOD)) % MOD;
				N2 = ((N2 % MOD) * (N2 % MOD)) % MOD;
			}
		}
		else if (start) {
			N2 = ((N1 % MOD) * (N2 % MOD)) % MOD;
			N1 = ((N1 % MOD) * (N1 % MOD)) % MOD;
		}
	}

	fprintf(g, "%lld", N1);

	fclose(f);
	fclose(g);
	return 0;
}