#include <iostream>
#include <string>
#include <vector>
#include <deque>
using namespace std;
 
class matrix{ //создаем класс матрицы, в основном для красивого перемножения
    private:
        int n,m;
        int long long **arr;
    public:
        matrix(){
            n = 1; m = 1;
        }
        matrix(int x){
            n = x; m = x;
            arr = new int long long *[n];
            for(int i = 0; i < n; i++){
                arr[i] = new int long long [m];
            }
            for(int j = 0; j < this->n; j++){
                for(int k = 0; k < this->m; k++){
                    arr[j][k] = 0;
                }
            }
        }
        matrix(int x, int y){
            n = x; m = y;
            arr = new int long long *[n];
            for(int i = 0; i < n; i++){
                arr[i] = new int long long [m];
            }
            for(int j = 0; j < this->n; j++){ // необходимо инициализировать нулями,покольку в памяти может быть забытый мусор
                for(int k = 0; k < this->m; k++){
                    arr[j][k] = 0;
                }
            }
        } // выше были описанны конструкторы
        ~matrix(){
            for(int i = 0; i < n; i++){
                delete arr[i];
            }
            delete arr;
        }// деструктор
        void read(){
            for(int j = 0; j < this->n; j++){
                for(int k = 0; k < this->m; k++){
                    cin >> arr[j][k];
                }
            }
        }//функция ввода
        void write(){
            for(int j = 0; j < this->n; j++){
                for(int k = 0; k < this->m; k++){
                    cout << arr[j][k] << " ";
                }
                cout << endl;
            }
        }// функция вывода
        void create(int x, int y){
            n = x; m = y;
            arr = new int long long *[n];
            for(int i = 0; i < n; i++){
                arr[i] = new int long long [m];
            }
        }//функция измененияколичества выделяемой под нас памяти
        matrix& operator=(const matrix& x){
            for(int j = 0; j < this->n; j++){
                for(int k = 0; k < this->m; k++){
                    arr[j][k] = x.arr[j][k];
                }
            }
            return *this;
        }// переопределение оператора присваивания для матриц
        const matrix operator*(const matrix& x){
            matrix ans(this->n, this->m);
            for(int i = 0; i < this->n; i++){
                for(int j = 0; j < this->m; j++){
                    for(int k = 0; k < this->m; k++){
                        ans.arr[i][j]+= this-> arr[i][k] * x.arr[k][j];
                    }
                }
            }
            return ans;
        }//переопределение умножения для матриц
        matrix& operator*=(const matrix& x){
            matrix ans(this->n, this->m);
            for(int i = 0; i < this->n; i++){
                for(int j = 0; j < this->m; j++){
                    for(int k = 0; k < this->m; k++){
                        ans.arr[i][j]+= this-> arr[i][k] * x.arr[k][j];
                    }
                }
            }
            *this=ans;
            return *this;
        }//переопределение присвоить равно
        
        matrix& pow(int n){
            string s;
            for(int i = 0; i < sizeof(int)*8 -1; i++){// цикл где мы побитово сдвигаем вправо и умножаем на 1, если в этом бите была 1,то мы добавим в строку 1,если был 0,то 0 конъюнкия 1 будет 0
                s+= to_string((n >> i)&1);; 
            }
            int i = s.size()-1; // заводим переменную, в которой будет храниться наивисший разряд двойки
            for(; s[i]!= '1'; i--){} //находим этот разряд,двигаясь с конца в поисках первой 
            matrix ans(this->n,this->m);
            for(int j = 0; j < this->n; j++){
                for(int k = 0; k < this->m; k++){
                    if(j == k) ans.arr[j][k] = 1; else ans.arr[j][k] = 0; 
                }
            }
            matrix temp(this->n,this->m);
            temp = *this;
            for(int j = 0; j <= i; j++){
                if(s[j] == '1'){
                    ans*=temp;
                }
                temp*=temp;
            }
            *this=ans;
            return *this;
        }
};
 
int main() {
    int n,size = 2; string s; //n число,в которую нам надо возвести в степень,размеры матрицы и строка,в которой будем для удобства хранить двоичное представление числа
    cin >> n;
    matrix mas(size); // создаем матрицу
    mas.read();
    mas.pow(n);
    mas.write();
    return 0;
}
Для отправки комментария необходимо войти на сайт.