Submission

Status:
[PPPPPPPPPPPPPPPPPPPP]

Score: 100

User: CaldarianX

Problemset: ยกกำลัง

Language: cpp

Time: 0.042 second

Submitted On: 2024-11-20 13:28:36

#include <iostream>

using namespace std;

class Expo{

  public:
    long long int mod;
    int base;
    int power;
    long long int pow[1000000];
    int currentIndex;

    Expo(long long int based,int powered){
      base = based;
      power = powered;
      currentIndex = 0;
      mod = 1000000007;
      pow[0] = based % mod;
    }
    long long int getAnswer(){
      int position = 0;
      long long int answer = 1;
      int temppow = power;
      while(temppow > 0){
        int remain = temppow%2;
        temppow /= 2;
        if(remain == 1){
          answer *= getExpo(position);
          //cout<<getExpo(position)<<" at "<<position<<"\n";
          answer %= mod;
        }
        position += 1;
      }
      return answer;
    }
    long long int getExpo(int x){
      while(x+1 >= currentIndex){
        extendPow();
      }
      return pow[x];
    }
    void debuging(){
      for(int i =0;i<10;i++){
        extendPow();
      }
      for(int i =0;i<10;i++){
        cout<<pow[i]<<" ";
      }
    }
    void extendPow(){
      currentIndex += 1;
      pow[currentIndex] = (pow[currentIndex-1] * pow[currentIndex-1]);
      pow[currentIndex] %= mod;
    }
};


int main(){
  int num;
  cin>>num;
  int pow,base = 0;
  for(int i =0;i<num;i++){
    cin>>base>>pow;
    Expo numx = Expo(base,pow);
    cout<<numx.getAnswer()<<"\n";
  }

}