fork download
  1. // tính a^b trong O(log2(b))
  2.  
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. const int MOD = 1e9 + 7;
  7. // const int MOD = 998244353;
  8.  
  9. // thuật toán ngây thơ O(b)
  10. long long power(int a, int b) {
  11. long long ans = 1;
  12. for (int i = 1; i <= b; i++) ans = ans * a;
  13. return ans;
  14. }
  15.  
  16. // a^b:
  17. // trường hợp b chẵn: a^b = a^(b / 2) * a^(b / 2)
  18. // trường hợp b lẻ: a^b = a^(b / 2) * a^(b / 2) * a
  19. long long power1(long long a, long long b) {
  20. if (b == 0) return 1;
  21. if (b == 1) return a % MOD;
  22. long long x = power1(a, b / 2);
  23. long long ans;
  24. if (b % 2 == 0) {
  25. ans = x * x % MOD;
  26. }
  27. else {
  28. ans = x * x % MOD * a % MOD;
  29. }
  30. return ans;
  31. }
  32.  
  33. // Cách 2: dùng for
  34. // Ý tưởng: phân tích b qua hệ nhị phân
  35. // b = 2^n1 + 2^n2 + 2^n3 + ... + 2^nk
  36.  
  37. // a^b = a^(2^n1 + 2^n2 + 2^n3 + ... + 2^nk)
  38.  
  39. // = a^(2^n1) * a^(2^n2) * a^(2^n3) * a^(2^n4)
  40.  
  41. // b = 10
  42. // hệ nhị phân b = 1010 = 2^3 + 2^1
  43.  
  44. // a^10 = a^(2^3 + 2^1) = a^(2^3) * a^(2^1)
  45.  
  46. // 3^10 = 59049
  47. // 3^10 = 3^(2^3) * 3^(2^1) = 3^8 * 3^2 = 6561 * 9 = 59049
  48. long long power2(long long a, long long b) {
  49. long long ans = 1;
  50. while (b > 0) {
  51. int bit = b % 2;
  52. if (bit == 1) ans = ans * a % MOD;
  53. a = a * a % MOD;
  54. b /= 2;
  55. }
  56. return ans;
  57. }
  58.  
  59. int main() {
  60. ios::sync_with_stdio(0); cin.tie(0);
  61. long long a, b;
  62. cin >> a >> b;
  63.  
  64. cout << power(a, b) << '\n';
  65. cout << power1(a, b) << '\n';
  66. cout << power2(a, b) << '\n';
  67. }
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
1
875720441
644801962