Cod sursa(job #3297994)

Utilizator sonia.peiovPeiov Sonia sonia.peiov Data 25 mai 2025 18:07:12
Problema Ridicare la putere in timp logaritmic Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
// https://infoarena.ro/problema/lgput
// Dandu-se doua numere naturale N si P, se cere sa se calculeze restul impartirii lui N^P la 1999999973.

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

// Functia calculeaza baza^exponent folosind exponentierea rapida
unsigned int ExponentiereRapida(unsigned int baza, unsigned int exponent)
{
	if (exponent == 0)
	{
		return 1; // Orice numar la puterea 0 este 1
	}

	// Nu tratam cazul exponent < 0 deoarece stim ca N si P sunt naturale

	unsigned int rezultat = 1;
	while (exponent > 0)
	{
		if (exponent % 2 == 1)
		{
			rezultat = rezultat * baza;
		}
		baza = baza * baza;
		exponent = exponent / 2;
	}
	return rezultat;
}

int main()
{
    ifstream fin("lgput.in");
	ofstream fout("lgput.out");

    if (!fin.is_open())
    {
        cerr << "Eroare la deschiderea fisierului de intrare!";
        return 1;
    }

	if (!fout.is_open())
	{
		cerr << "Eroare la deschiderea fisierului de iesire!";
		return 1;
	}


	unsigned int N, P;
	fin >> N >> P;
	if (N < 2 || P > pow(2, 32))
	{
		cerr << "Nu se respecta restrictiile: N <= 2 si P <= 2^32";
		return 1;
	}

	unsigned int rezultat = ExponentiereRapida(N, P);
	const unsigned int mod = 1999999973;
	
	fout << rezultat % mod << endl;
	
	fin.close();
	fout.close();

	return 0;
}