Advertisement
nq1s788

Untitled

Mar 30th, 2023
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. //
  2. // Created by Beast on 25.03.2023.
  3. // https://codeforces.com/problemset/problem/1117/D
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7.  
  8. using namespace std;
  9. typedef long long ll;
  10.  
  11. int m;
  12. vector<vector<int>> a; ///m*m
  13. vector<vector<int>> bufet;  ///m*m
  14.  
  15. ll x; ///(x^1)
  16.  
  17. ll normal_pow_int(int n, ll x) {
  18.     if (n == 0) return 1;
  19.     if (n % 2 == 0) {
  20.         ll k = normal_pow_int(n / 2, x);
  21.         return k * k;
  22.     }
  23.     return normal_pow_int(n - 1, x) * x; /// x^(n - 1) * x^1
  24. }
  25.  
  26. void pow_global_int(int n) {  ///(x^1 -> x^n)
  27.     if (n == 0) {
  28.         x = 1;
  29.         return;
  30.     }
  31.     if (n % 2 == 0) {
  32.         pow_global_int(n / 2); /// x^1 -> x^(n/2)
  33.         x *= x; /// x^(n/2) -> x^n;
  34.         return;
  35.     } else {
  36.         ll k = x; /// k = x^1 ///копия матрицы
  37.         pow_global_int(n - 1); /// x^1 -> x^(n - 1) /// x = 1; ///pow(n - 1)
  38.         x *= k;  /// (x^(n - 1) -> x^n) ///x = x * k = 1 * x^1 = x^1 ///перемножаем глобальную матрицу на копию
  39.         return;
  40.     }
  41. }
  42.  
  43.  
  44. void pow(int n) {
  45.     if (n == 1) {
  46.         return;
  47.     }
  48.     if (n % 2 == 0) {
  49.         pow(n / 2);
  50.  
  51.         for (int i = 0; i < m; i++){
  52.             for (int j = 0; j < m; ++j){
  53.                 bufet[i][j] = a[i][j];    
  54.             }
  55.         }
  56.         for (int i = 0; i < m; i++) {
  57.             for (int j = 0; j < m; j++) {
  58.                 a[i][j] = 0;
  59.                 for (int k = 0; k < m; k++) a[i][j] += bufet[i][k] * bufet[k][j];
  60.             }
  61.         }
  62.         return;
  63.     } else {
  64.         for (int i = 0; i < m; i++){ //сохранили a^1
  65.             for (int j = 0; j < m; ++j){
  66.                 bufet[i][j] = a[i][j];    
  67.             }
  68.         }
  69.         pow(n - 1); /// a^1 -> a^(n - 1)
  70.        
  71.         for(int i = 0; i < m; ++i){
  72.             for(int j = 0; j < m; ++j){
  73.                 for(int k = 0; k < m; ++k) a[i][j] += bufet[i][k] * a[k][j];
  74.         }
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement