/*
行列xを表示
1 2
3 4
5 6
行列yを表示
1 2 4
3 6 9
行列xとyの積を表示
*/
/* 計算する行列 */
#define MATRIXA {{1,2},{3,4},{5,6}} /* 行列A */
#define MATRIXA_X 3 /* 行列Aの大きさ */
#define MATRIXA_Y 2 /* 行列Aの大きさ */
#define MATRIXB {{1,2,4},{3,6,9}} /* 行列A */
#define MATRIXB_X 2 /* 行列Bの大きさ */
#define MATRIXB_Y 3 /* 行列Bの大きさ */
/*-- 以上定数 --*/
/* 以下ソース */
# define s float
#define i int
# define XX \
void X
# define PF "%f"
# define a MATRIXA
# define a1 MATRIXA_X
# define a2 MATRIXA_Y
# define p(o) f("%s\n",o)
# define b1 MATRIXB_X
#define S sizeof
# define z 0
# define f __builtin_printf
# define b MATRIXB
# define b2 MATRIXB_Y
# define sz (4*la*lb)
#define SP " "
#define M main
#define B ()
#define E X B, 0;
# define l(a) S(a)/S(a[0])
# define al __builtin_alloca \
#define zr(o,c) \
__builtin_memset(o,z,c)
# define r for
#define e \
""
#define op PF SP
XX B{
s ma[a1][a2]=a, mb[b1][b2]=b;
i la=l(ma),la2=l(ma[z]);i lb=l(mb[z]),n=z,x,y,Z;
s* o=al(sz);zr(o,sz);
r(Z=z;Z<la;++Z){r(y=z;y<lb;++y){
r(x=z;x<la2;++x){o[n]+=ma[Z][x]*mb[x][y];
}++n;
}}
r(n=z,y=z;y<lb;++y){r(x=z;x<la;++x){
f(op,o[n++]);}
p(e);
}}i M B{return E}
LyoK6KGM5YiXeOOCkuihqOekuiAKMSAyIAozIDQgCjUgNiAKCuihjOWIl3njgpLooajnpLogCjEgMiA0IAozIDYgOSAKCuihjOWIl3jjgah544Gu56mN44KS6KGo56S6IAogKi8KLyog6KiI566X44GZ44KL6KGM5YiXICovCiNkZWZpbmUgTUFUUklYQSB7ezEsMn0sezMsNH0sezUsNn19ICAgIC8qIOihjOWIl0EgKi8KI2RlZmluZSBNQVRSSVhBX1ggMwkJLyog6KGM5YiXQeOBruWkp+OBjeOBlSAqLwojZGVmaW5lIE1BVFJJWEFfWSAyCQkvKiDooYzliJdB44Gu5aSn44GN44GVICovCiNkZWZpbmUgTUFUUklYQiB7ezEsMiw0fSx7Myw2LDl9fQkvKiDooYzliJdBICovCiNkZWZpbmUgTUFUUklYQl9YIDIJCS8qIOihjOWIl0Ljga7lpKfjgY3jgZUgKi8KI2RlZmluZSBNQVRSSVhCX1kgMwkJLyog6KGM5YiXQuOBruWkp+OBjeOBlSAqLwovKi0tIOS7peS4iuWumuaVsCAtLSovCgoKLyog5Lul5LiL44K944O844K5ICovCiMJZGVmaW5lIHMJCQkgZmxvYXQKI2RlZmluZSBpIGludAoJIwlkZWZpbmUgWFggXAp2b2lkIFgKIwkJCQlkZWZpbmUgCVBGIAkiJWYiCgkjCQlkZWZpbmUgYQkgTUFUUklYQQojCWRlZmluZSBhMSBNQVRSSVhBX1gKIwkJZGVmaW5lIGEyIE1BVFJJWEFfWQoJIwkJCWRlZmluZSAJcChvKSBmKCIlc1xuIixvKQojCQlkZWZpbmUgCQliMSBNQVRSSVhCX1gKI2RlZmluZSBTCQkgc2l6ZW9mCgkjCWRlZmluZSB6IDAKCQkjCWRlZmluZSBmIF9fYnVpbHRpbl9wcmludGYKIwkJCWRlZmluZSAJYiBNQVRSSVhCCiMJCWRlZmluZQkJCSBiMiBNQVRSSVhCX1kKCSMJCQlkZWZpbmUgc3ogKDQqbGEqbGIpCiNkZWZpbmUgCQkJCVNQICIgIgojZGVmaW5lIE0gbWFpbgojZGVmaW5lIEIgKCkKCQkjZGVmaW5lIEUgWCBCLCAwOwojCWRlZmluZSBsKGEpIFMoYSkvUyhhWzBdKQoJCSMgZGVmaW5lIGFsIF9fYnVpbHRpbl9hbGxvY2EgXAoJCiNkZWZpbmUgenIobyxjKSBcCglfX2J1aWx0aW5fbWVtc2V0KG8seixjKQoJIyBkZWZpbmUgciBmb3IKI2RlZmluZSBlIFwKIiIKI2RlZmluZSBvcCBQRiBTUApYWCBCewpzIG1hW2ExXVthMl09YSwgbWJbYjFdW2IyXT1iOwppIGxhPWwobWEpLGxhMj1sKG1hW3pdKTtpIGxiPWwobWJbel0pLG49eix4LHksWjsKcyogbz1hbChzeik7enIobyxzeik7CnIoWj16O1o8bGE7KytaKXtyKHk9ejt5PGxiOysreSl7CnIoeD16O3g8bGEyOysreCl7b1tuXSs9bWFbWl1beF0qbWJbeF1beV07Cn0rK247Cn19CnIobj16LHk9ejt5PGxiOysreSl7cih4PXo7eDxsYTsrK3gpewpmKG9wLG9bbisrXSk7fQpwKGUpOwp9fWkgTSBCe3JldHVybiBFfQo=