Advertisement
YEZAELP

SMMR-033: Power Mod (Level God)

May 2nd, 2021
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. using v_char = vector <char>;
  6.  
  7. void pv(v_char v){ // check vector
  8.     for(auto i: v) printf("%c", i);
  9.     printf("\n");
  10. }
  11.  
  12. v_char multiplication(v_char num1, v_char num2){
  13.     v_char digit[50];
  14.     int sz1 = num1.size();
  15.     int idx = 1;
  16.     for(int i=sz1-1;i>=0;i--){
  17.         int r = 0;
  18.         for(int j=1;j<idx;j++) digit[idx].push_back('0');
  19.         int n = (num1[i] - '0');
  20.         int sz2 = num2.size();
  21.         for(int j=sz2-1;j>=0;j--){
  22.             int dg = num2[j] - '0';
  23.             int m = dg * n + r;
  24.             digit[idx].push_back((m%10) + '0');
  25.             r = m/10;
  26.         }
  27.         if(r > 0) digit[idx].push_back(r + '0');
  28.         idx ++;
  29.     }
  30.     v_char ans(digit[idx-1].size()+1, '0');
  31.     for(int j=0;j<digit[1].size();j++) ans[j] = digit[1][j];
  32.     for(int i=2;i<idx;i++){
  33.         int sz = digit[i].size();
  34.         int r = 0;
  35.         for(int j=0;j<sz;j++){
  36.             int dg = digit[i][j] - '0';
  37.             int n = ans[j] - '0';
  38.             int m = dg + n + r;
  39.             ans[j] = (m%10) + '0';
  40.             r = m/10;
  41.         }
  42.         ans[sz] += r;
  43.     }
  44.     reverse(ans.begin(), ans.end());
  45.     return ans;
  46. }
  47.  
  48. int find_digit(lli num){
  49.     int digit = 0;
  50.     while(num > 0){
  51.         num = num / 10;
  52.         digit ++;
  53.     }
  54.     return digit;
  55. }
  56.  
  57. lli find_number(int l, int r, v_char v){
  58.     lli num = 0;
  59.     for(int i=l;i<=r;i++){
  60.         num = num * 10 + v[i] - '0';
  61.     }
  62.     return num;
  63. }
  64.  
  65. v_char modulo(v_char num, lli mod){
  66.     int dg = find_digit(mod);
  67.     if(num.size() < dg) return num;
  68.     lli r = find_number(0, dg-1, num) % mod;
  69.     for(int i=dg;i<num.size();i++){
  70.         r = 10*r + num[i] - '0';
  71.         r = r % mod;
  72.     }
  73.  
  74.     v_char ans;
  75.     if(r == 0) ans.push_back('0');
  76.     while(r > 0){
  77.         ans.push_back((r%10) + '0');
  78.         r = r / 10;
  79.     }
  80.     reverse(ans.begin(), ans.end());
  81.     return ans;
  82. }
  83.  
  84. v_char f(v_char n, lli k, lli m){
  85.     if(k == 0){
  86.         v_char ans {'1'};
  87.         return ans;
  88.     }
  89.     if(k == 1)
  90.         return n;
  91.     v_char Mod = f(n, k/2, m);
  92.     Mod = modulo( multiplication(Mod, Mod), m);
  93.     if(k % 2 == 0) {
  94.         return Mod;
  95.     }
  96.     v_char multi = multiplication(Mod, n);
  97.     Mod = modulo( multi, m);
  98.     return Mod;
  99. }
  100.  
  101. int main(){
  102.  
  103.     lli n, k, m;
  104.     scanf("%lld%lld%lld", &n, &k, &m);
  105.  
  106.     v_char num;
  107.     while(n > 0){
  108.         num.push_back((n%10) + '0');
  109.         n = n / 10;
  110.     }
  111.     reverse(num.begin(), num.end());
  112.  
  113.     v_char ans = f(modulo(num, m), k, m);
  114.  
  115.     for(auto a: ans) printf("%c", a);
  116.  
  117.     return 0;
  118. }
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement