Cod sursa(job #3310095)

Utilizator razviii237Uzum Razvan razviii237 Data 11 septembrie 2025 18:00:38
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
//#include <iostream>
#include <fstream>
#include <set>
#include <queue>
#define int long long

using namespace std;

ifstream cin("lgput.in");
ofstream cout("lgput.out");

int n, p;
const int mod = 1999999973;

int ridica(int n, int p) {
    if(p == 0)
        return 1;
    int half = ridica(n, p/2);
    if(p % 2 == 0)
        return half * half % mod;
    else
        return half * half % mod * n % mod;
}

int ridicaIterativ(int n, int p) {
    // 2 ^ 7
    //     7 = 111
    //     7 = 4 + 2 + 1
    //           2
    //          4
    //        16
    int rez = 1, a = n;
    while(p > 0) {
        int ultimulBit = p % 2;
        if(ultimulBit == 1) {
            rez *= a;
            rez %= mod;
        }
        a = a * a;
        a = a % mod;
        p /= 2;
    }
    return rez;
}

signed main()
{
    cin >> n >> p;
    cout << ridicaIterativ(n, p);

    return 0;
}