//递归方法 longlongbinpow(longlong a, longlong b){ if (b == 0) return1; longlong res = binpow(a, b / 2); if (b % 2) return res * res * a; else return res * res; }
//非递归方法 longlongbinpow(longlong a, longlong b){ longlong res = 1; while (b > 0) { if (b & 1) res = res * a; a = a * a; b >>= 1; } return res; }
然后就会注意到一个问题,因为时间复杂度是O(logn),所以n最大可以取1e6
而1e61e6似乎用高精都会TLE
所以我们可以在过程中取模,像下面这样:
1 2 3 4 5 6 7 8 9 10 11
//求a ^ b mod m 的值 longlongbinpow(longlong a, longlong b, longlong m){ a %= m; longlong res = 1; while (b > 0) { if (b & 1) res = res * a % m; a = a * a % m; b >>= 1; } return res; }