fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // Cách 1: Nhị phân lũy thừa
  5. long long power_iterative(long long a, long long n, long long m) {
  6. long long res = 1;
  7. a %= m;
  8.  
  9. while (n > 0) {
  10. if (n & 1) { // Nếu bit cuối của n là 1 (n lẻ)
  11. res = (res * a) % m; // Nhân cơ số a hiện tại vào kết quả
  12. }
  13. a = (a * a) % m; // Bình phương cơ số a
  14. n >>= 1; // Dịch phải 1 bit (chia đôi n)
  15. }
  16.  
  17. return res;
  18. }
  19.  
  20. // Cách 2: Đệ quy
  21. long long power_recursive(long long a, long long n, long long m) {
  22. if (n == 0) return 1 % m;
  23.  
  24. a %= m;
  25. long long half = power_recursive(a, n / 2, m); // Tính a^(n/2)
  26. long long half_sq = (half * half) % m;
  27.  
  28. if (n % 2 == 1) { // Nếu n lẻ: a^n = a * (a^(n/2))^2
  29. return (half_sq * a) % m;
  30. } else { // Nếu n chẵn: a^n = (a^(n/2))^2
  31. return half_sq;
  32. }
  33. }
  34.  
  35. int main() {
  36. long long a = 3;
  37. long long n = 13;
  38. long long m = 1e9 + 7;
  39.  
  40. cout << power_iterative(a, n, m) << "\n" << power_recursive(a, n, m); // Output: 1594323
  41. return 0;
  42. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
1594323
1594323