Cod sursa(job #2702632)

Utilizator retrogradLucian Bicsi retrograd Data 5 februarie 2021 02:00:40
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>

using namespace std;

// Set T2 such that (T2)mod * mod does not overflow.
using T = uint32_t;
using T2 = uint64_t;
const int BITS = 8 * sizeof(T);

const T mod = 1999999973, inv = 2462478829, r2 = 740599963;
T reduce(T2 x) {
  T q = (T)x * inv;
  T a = (T)((x - (T2)q * mod) >> BITS);
  if (a >= mod) a += mod;
  return a;
}
T mul(T a, T b) { return reduce((T2)a * b); }
T add(T a, T b) { a += b; if (a >= mod) a -= mod; return a; }
T sub(T a, T b) { return add(a, mod - b); }
T tomont(T x) { return mul(x, r2); }
T toreal(T x) { return reduce(x); }
T lgpow(T b, T e) {
  T r = tomont(1);
  while (e) { 
    if (e % 2) r = mul(r, b);
    b = mul(b, b); e /= 2; 
  }
  return r;
}

int main() {
  ifstream cin("lgput.in");
  ofstream cout("lgput.out");
  int a, b; cin >> a >> b;
  cout << toreal(lgpow(tomont(a), b)) << endl;
}