#include<iostream>
using namespace std;
#include<vector>
const int INF=3;
typedef struct node
{
int m[INF][INF];
}Matrix;
Matrix P={2,3,4,4,5,6,4,5,3};
Matrix I={1,0,0,0,1,0,0,0,1};
Matrix multy(Matrix a,Matrix b)
{
Matrix c;
for (int i=0;i<INF;i++)
{
for (int j=0;j<INF;j++)
{
int ans=0;
for (int k=0;k<INF;k++)
{
ans+=a.m[i][k]*b.m[k][j];
}
c.m[i][j]=ans;
}
}
return c;
}
Matrix quick_matrix(int b)
{
Matrix ans=I;
while(b)
{
if(b&1)
{
ans=multy(ans,P);
b--;
}
b/=2;
P=multy(P,P);
}
return ans;
}
int main()
{
int a=3,b=27,m=3;
//int x=quick_mul(a,b,m);
//cout<<x<<endl;
Matrix test=quick_matrix(6);
for (int i=0;i<INF;i++)
{
for (int j=0;j<INF;j++)
{
cout<<test.m[i][j]<<" ";
}
cout<<endl;
}
}
using namespace std;
#include<vector>
const int INF=3;
typedef struct node
{
int m[INF][INF];
}Matrix;
Matrix P={2,3,4,4,5,6,4,5,3};
Matrix I={1,0,0,0,1,0,0,0,1};
Matrix multy(Matrix a,Matrix b)
{
Matrix c;
for (int i=0;i<INF;i++)
{
for (int j=0;j<INF;j++)
{
int ans=0;
for (int k=0;k<INF;k++)
{
ans+=a.m[i][k]*b.m[k][j];
}
c.m[i][j]=ans;
}
}
return c;
}
Matrix quick_matrix(int b)
{
Matrix ans=I;
while(b)
{
if(b&1)
{
ans=multy(ans,P);
b--;
}
b/=2;
P=multy(P,P);
}
return ans;
}
int main()
{
int a=3,b=27,m=3;
//int x=quick_mul(a,b,m);
//cout<<x<<endl;
Matrix test=quick_matrix(6);
for (int i=0;i<INF;i++)
{
for (int j=0;j<INF;j++)
{
cout<<test.m[i][j]<<" ";
}
cout<<endl;
}
}