Cod sursa(job #2535259)

Utilizator rareshinnhoMiroiu Rares rareshinnho Data 31 ianuarie 2020 18:18:26
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("lgput.in");
ofstream g("lgput.out");

unsigned long long exp(long long x,long long n){
    if(n==0)return 1;
    long long y=1;
    while(n>1){
        if(n%2==0){
            x=x*x;
            n=n/2;
        }
        else{
            y=x*y;
            x=x*x;
            n=(n-1)/2;
        }
    }
    return x*y;
}

int main()
{
    int m=1999999973;
    int i=1;
    long long n,p,sol=1,a;
    f>>n>>p;
    a=n;

	a = n;
	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))
	}
    g<<sol;
    return 0;
}