Pagini recente » Cod sursa (job #63945) | Cod sursa (job #962445) | Cod sursa (job #2906843) | Cod sursa (job #1782892) | Cod sursa (job #2702632)
#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;
}