// tính a^b trong O(log2(b))
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
// const int MOD = 998244353;
// thuật toán ngây thơ O(b)
long long power(int a, int b) {
long long ans = 1;
for (int i = 1; i <= b; i++) ans = ans * a;
return ans;
}
// a^b:
// trường hợp b chẵn: a^b = a^(b / 2) * a^(b / 2)
// trường hợp b lẻ: a^b = a^(b / 2) * a^(b / 2) * a
long long power1(long long a, long long b) {
if (b == 0) return 1;
if (b == 1) return a % MOD;
long long x = power1(a, b / 2);
long long ans;
if (b % 2 == 0) {
ans = x * x % MOD;
}
else {
ans = x * x % MOD * a % MOD;
}
return ans;
}
// Cách 2: dùng for
// Ý tưởng: phân tích b qua hệ nhị phân
// b = 2^n1 + 2^n2 + 2^n3 + ... + 2^nk
// a^b = a^(2^n1 + 2^n2 + 2^n3 + ... + 2^nk)
// = a^(2^n1) * a^(2^n2) * a^(2^n3) * a^(2^n4)
// b = 10
// hệ nhị phân b = 1010 = 2^3 + 2^1
// a^10 = a^(2^3 + 2^1) = a^(2^3) * a^(2^1)
// 3^10 = 59049
// 3^10 = 3^(2^3) * 3^(2^1) = 3^8 * 3^2 = 6561 * 9 = 59049
long long power2(long long a, long long b) {
long long ans = 1;
while (b > 0) {
int bit = b % 2;
if (bit == 1) ans = ans * a % MOD;
a = a * a % MOD;
b /= 2;
}
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
long long a, b;
cin >> a >> b;
cout << power(a, b) << '\n';
cout << power1(a, b) << '\n';
cout << power2(a, b) << '\n';
}
Ly8gdMOtbmggYV5iIHRyb25nIE8obG9nMihiKSkgCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsgCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgICAKLy8gY29uc3QgaW50IE1PRCA9IDk5ODI0NDM1MzsgCgovLyB0aHXhuq10IHRvw6FuIG5nw6J5IHRoxqEgTyhiKSAKbG9uZyBsb25nIHBvd2VyKGludCBhLCBpbnQgYikgewoJbG9uZyBsb25nIGFucyA9IDE7ICAKCWZvciAoaW50IGkgPSAxOyBpIDw9IGI7IGkrKykgYW5zID0gYW5zICogYTsgIAoJcmV0dXJuIGFuczsgIAp9CgovLyBhXmI6IAovLyB0csaw4budbmcgaOG7o3AgYiBjaOG6tW46IGFeYiA9IGFeKGIgLyAyKSAqIGFeKGIgLyAyKSAKLy8gdHLGsOG7nW5nIGjhu6NwIGIgbOG6uzogICBhXmIgPSBhXihiIC8gMikgKiBhXihiIC8gMikgKiBhICAgCmxvbmcgbG9uZyBwb3dlcjEobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSB7CglpZiAoYiA9PSAwKSByZXR1cm4gMTsgICAgCglpZiAoYiA9PSAxKSByZXR1cm4gYSAlIE1PRDsgICAKCWxvbmcgbG9uZyB4ID0gcG93ZXIxKGEsIGIgLyAyKTsgCglsb25nIGxvbmcgYW5zOyAgIAoJaWYgKGIgJSAyID09IDApIHsKCQlhbnMgPSB4ICogeCAlIE1PRDsgIAoJfSAgCgllbHNlIHsKCQlhbnMgPSB4ICogeCAlIE1PRCAqIGEgJSBNT0Q7ICAKCX0gCglyZXR1cm4gYW5zOyAKfQoKLy8gQ8OhY2ggMjogZMO5bmcgZm9yCi8vIMOdIHTGsOG7n25nOiBwaMOibiB0w61jaCBiIHF1YSBo4buHIG5o4buLIHBow6JuICAKLy8gYiA9IDJebjEgKyAyXm4yICsgMl5uMyArIC4uLiArIDJebmsKCi8vIGFeYiA9IGFeKDJebjEgKyAyXm4yICsgMl5uMyArIC4uLiArIDJebmspIAoKLy8gICAgID0gYV4oMl5uMSkgKiBhXigyXm4yKSAqIGFeKDJebjMpICogYV4oMl5uNCkKCi8vIGIgPSAxMAovLyBo4buHIG5o4buLIHBow6JuIGIgPSAxMDEwID0gMl4zICsgMl4xCgovLyBhXjEwID0gYV4oMl4zICsgMl4xKSA9IGFeKDJeMykgKiBhXigyXjEpCgovLyAzXjEwID0gNTkwNDkKLy8gM14xMCA9IDNeKDJeMykgKiAzXigyXjEpID0gM144ICogM14yID0gNjU2MSAqIDkgPSA1OTA0OQpsb25nIGxvbmcgcG93ZXIyKGxvbmcgbG9uZyBhLCBsb25nIGxvbmcgYikgewoJbG9uZyBsb25nIGFucyA9IDE7ICAKCXdoaWxlIChiID4gMCkgewoJCWludCBiaXQgPSBiICUgMjsgICAKCQlpZiAoYml0ID09IDEpIGFucyA9IGFucyAqIGEgJSBNT0Q7ICAgCgkJYSA9IGEgKiBhICUgTU9EOyAgIAoJCWIgLz0gMjsgIAoJfQoJcmV0dXJuIGFuczsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7ICAKCWxvbmcgbG9uZyBhLCBiOyAKCWNpbiA+PiBhID4+IGI7ICAKCgljb3V0IDw8IHBvd2VyKGEsIGIpIDw8ICdcbic7ICAKCWNvdXQgPDwgcG93ZXIxKGEsIGIpIDw8ICdcbic7IAoJY291dCA8PCBwb3dlcjIoYSwgYikgPDwgJ1xuJzsgCQp9