#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Ma
{
int n;
int a[4][4];
Ma(int nn){
n = nn;
}
};
int a[4][4] = {1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16};
void Pr(Ma m)//输出
{
for(int i = 0;i < m.n;i++){
for(int j = 0;j < m.n;j++){
printf("%d ",m.a[i][j]);
}
printf("\n");
}
}
Ma Cp(Ma A,int x,int y)//复制函数
{
x--;y--;
Ma B = Ma(A.n / 2);
for(int i = 0;i < B.n;i++){
for(int j = 0;j < B.n;j++){
B.a[i][j] = A.a[i + x * B.n][j + y * B.n];
}
}
return B;
}
Ma Ad(Ma A,Ma B,int x)//加,减法
{
Ma C = Ma(A.n);
for(int i = 0;i < C.n;i++){
for(int j = 0;j < C.n;j++){
C.a[i][j] = A.a[i][j] + x * B.a[i][j];
}
}
return C;
}
Ma f(Ma A,Ma B)
{
int n = A.n;
if(n == 1){
Ma C = Ma(1);
C.a[0][0] = A.a[0][0] * B.a[0][0];
return C;
}
Ma a11 = Cp(A,1,1);
Ma a12 = Cp(A,1,2);
Ma a21 = Cp(A,2,1);
Ma a22 = Cp(A,2,2);
Ma b11 = Cp(B,1,1);
Ma b12 = Cp(B,1,2);
Ma b21 = Cp(B,2,1);
Ma b22 = Cp(B,2,2);
Ma s1 = Ad(b12,b22,-1);
Ma s2 = Ad(a11,a12,1);
Ma s3 = Ad(a21,a22,1);
Ma s4 = Ad(b21,b11,-1);
Ma s5 = Ad(a11,a22,1);
Ma s6 = Ad(b11,b22,1);
Ma s7 = Ad(a12,a22,-1);
Ma s8 = Ad(b21,b22,1);
Ma s9 = Ad(a11,a21,-1);
Ma s10 = Ad(b11,b12,1);
Ma p1 = f(a11,s1);
Ma p2 = f(s2,b22);
Ma p3 = f(s3,b11);
Ma p4 = f(a22,s4);
Ma p5 = f(s5,s6);
Ma p6 = f(s7,s8);
Ma p7 = f(s9,s10);
Ma c11 = Ad(Ad(Ad(p5,p4,1),p6,1),p2,-1);
Ma c12 = Ad(p1,p2,1);
Ma c21 = Ad(p3,p4,1);
Ma c22 = Ad(Ad(Ad(p5,p1,1),p3,-1),p7,-1);
Ma C = Ma(n);
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(i < n / 2 && j < n / 2){
C.a[i][j] = c11.a[i][j];
}
else if(i < n / 2 && j >= n / 2){
C.a[i][j] = c12.a[i][j - n / 2];
}
else if(i >= n / 2 && j < n / 2){
C.a[i][j] = c21.a[i - n / 2][j];
}
else{
C.a[i][j] = c22.a[i - n / 2][j - n / 2];
}
}
}
return C;
}
int main()
{
Ma m1 = Ma(4);
for(int i = 0;i < m1.n;i++){
for(int j = 0;j < m1.n;j++){
m1.a[i][j] = a[i][j];
}
}
Ma m2 = Ma(4);
for(int i = 0;i < m1.n;i++){
for(int j = 0;j < m1.n;j++){
m2.a[i][j] = a[i][j];
}
}
Ma C = f(m1,m2);
Pr(C);
return 0;
}