import java.lang.*;
class MP26
{
public static void main
(String[] args
) {
int[][] A={{1,0,0},{0,1,0},{0,0,1},{1,0,1}};
int[][] B={{1,2},{3,4},{5,6}};
int[][] C = Matrix.valueOf(A).multiply(Matrix.valueOf(B)).getArray();
java.
lang.
System.
out.
println(Matrix.
toString(C
)); }
private static class Matrix
{
private final int[][] array;
private final int row;
private final int col;
private Matrix (int[][] array)
{
this.array = array;
this.row = array.length;
this.col = array[0].length;
}
static boolean isMatrix (int[][] array)
{
if (array == null)
{
return false;
}
int col = -1;
for (int[] line : array)
{
if (line == null)
{
return false;
}
if (col < 0)
{
col = line.length;
}
else if (col != line.length)
{
return false;
}
}
if (col < 1)
{
return false;
}
return true;
}
Matrix multiply (Matrix B) throws MatrixException
{
if (B == null)
{
throw new NullArgumentException("B");
}
if (col != B.row)
{
throw new MatrixException("Unmatch size of B.row");
}
int[][] C = new int[row][B.col];
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < B.col; ++j)
{
for (int k = 0; k < col; ++k)
{
C[i][j] += array[i][k] * B.array[k][j];
}
}
}
return new Matrix(C);
}
int[][] getArray ()
{
return array.clone();
}
@Override
{
for (int[] line : array)
{
for (int value : line)
{
out.print(value + " ");
}
out.println();
}
return buf.toString();
}
static String toString
(int[][] array
) {
if (Matrix.isMatrix(array) == false)
{
}
return new Matrix(array).toString();
}
static Matrix valueOf (int[][] array)
{
if (Matrix.isMatrix(array) == false)
{
}
return new Matrix(array.clone());
}
}
private static class MatrixException
{
MatrixException
(String message
) {
super(message);
}
}
private static class NullArgumentException
{
NullArgumentException
(String argname
) {
super(argname);
}
}
}
aW1wb3J0IGphdmEubGFuZy4qOwoKY2xhc3MgTVAyNgp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykKCQl0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCWludFtdW10gQT17ezEsMCwwfSx7MCwxLDB9LHswLDAsMX0sezEsMCwxfX07CgkJaW50W11bXSBCPXt7MSwyfSx7Myw0fSx7NSw2fX07CgkJaW50W11bXSBDID0gTWF0cml4LnZhbHVlT2YoQSkubXVsdGlwbHkoTWF0cml4LnZhbHVlT2YoQikpLmdldEFycmF5KCk7CgkJCgkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbihNYXRyaXgudG9TdHJpbmcoQykpOwoJfQoJCglwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXRyaXgKCXsKCQlwcml2YXRlIGZpbmFsIGludFtdW10gYXJyYXk7CgkJcHJpdmF0ZSBmaW5hbCBpbnQgcm93OwoJCXByaXZhdGUgZmluYWwgaW50IGNvbDsKCQkKCQlwcml2YXRlIE1hdHJpeCAoaW50W11bXSBhcnJheSkKCQl7CgkJCXRoaXMuYXJyYXkgPSBhcnJheTsKCQkJdGhpcy5yb3cgPSBhcnJheS5sZW5ndGg7CgkJCXRoaXMuY29sID0gYXJyYXlbMF0ubGVuZ3RoOwoJCX0KCQkKCQlzdGF0aWMgYm9vbGVhbiBpc01hdHJpeCAoaW50W11bXSBhcnJheSkKCQl7CgkJCWlmIChhcnJheSA9PSBudWxsKSAKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlpbnQgY29sID0gLTE7CgkJCWZvciAoaW50W10gbGluZSA6IGFycmF5KQoJCQl7CgkJCQlpZiAobGluZSA9PSBudWxsKSAKCQkJCXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkKCQkJCWlmIChjb2wgPCAwKQoJCQkJewoJCQkJCWNvbCA9IGxpbmUubGVuZ3RoOwoJCQkJfQoJCQkJZWxzZSBpZiAoY29sICE9IGxpbmUubGVuZ3RoKQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKGNvbCA8IDEpCgkJCXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuIHRydWU7CgkJfQoJCQoJCU1hdHJpeCBtdWx0aXBseSAoTWF0cml4IEIpIHRocm93cyBNYXRyaXhFeGNlcHRpb24KCQl7CgkJCWlmIChCID09IG51bGwpCgkJCXsKCQkJCXRocm93IG5ldyBOdWxsQXJndW1lbnRFeGNlcHRpb24oIkIiKTsKCQkJfQoJCQkKCQkJaWYgKGNvbCAhPSBCLnJvdykKCQkJewoJCQkJdGhyb3cgbmV3IE1hdHJpeEV4Y2VwdGlvbigiVW5tYXRjaCBzaXplIG9mIEIucm93Iik7CgkJCX0KCQkJCgkJCWludFtdW10gQyA9IG5ldyBpbnRbcm93XVtCLmNvbF07CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm93OyArK2kpCgkJCXsKCQkJCWZvciAoaW50IGogPSAwOyBqIDwgQi5jb2w7ICsraikKCQkJCXsKCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNvbDsgKytrKQoJCQkJCXsKCQkJCQkJQ1tpXVtqXSArPSBhcnJheVtpXVtrXSAqIEIuYXJyYXlba11bal07CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBuZXcgTWF0cml4KEMpOwoJCX0KCQkKCQlpbnRbXVtdIGdldEFycmF5ICgpCgkJewoJCQlyZXR1cm4gYXJyYXkuY2xvbmUoKTsKCQl9CgkJCgkJQE92ZXJyaWRlCgkJcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQoJCXsKCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmIAoJCQkJPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJamF2YS5pby5QcmludFN0cmVhbSBvdXQKCQkJCT0gbmV3IGphdmEuaW8uUHJpbnRTdHJlYW0oYnVmKTsKCQkJCgkJCWZvciAoaW50W10gbGluZSA6IGFycmF5KQoJCQl7CgkJCQlmb3IgKGludCB2YWx1ZSA6IGxpbmUpCgkJCQl7CgkJCQkJb3V0LnByaW50KHZhbHVlICsgIiAiKTsKCQkJCX0KCQkJCW91dC5wcmludGxuKCk7CgkJCX0KCQkJCgkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKCQl9CgkJCgkJc3RhdGljIFN0cmluZyB0b1N0cmluZyAoaW50W11bXSBhcnJheSkKCQl7CgkJCWlmIChNYXRyaXguaXNNYXRyaXgoYXJyYXkpID09IGZhbHNlKQoJCQl7CgkJCQl0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJyYXkiKTsJCgkJCX0KCQkJcmV0dXJuIG5ldyBNYXRyaXgoYXJyYXkpLnRvU3RyaW5nKCk7CgkJfQoKCQlzdGF0aWMgTWF0cml4IHZhbHVlT2YgKGludFtdW10gYXJyYXkpCgkJewoJCQlpZiAoTWF0cml4LmlzTWF0cml4KGFycmF5KSA9PSBmYWxzZSkKCQkJewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFycmF5Iik7CgkJCX0KCQkJcmV0dXJuIG5ldyBNYXRyaXgoYXJyYXkuY2xvbmUoKSk7CgkJfQoJfQoKCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hdHJpeEV4Y2VwdGlvbgoJCWV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCU1hdHJpeEV4Y2VwdGlvbiAoU3RyaW5nIG1lc3NhZ2UpCgkJewoJCQlzdXBlcihtZXNzYWdlKTsKCQl9Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbEFyZ3VtZW50RXhjZXB0aW9uCgkJZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCgl7CgkJTnVsbEFyZ3VtZW50RXhjZXB0aW9uIChTdHJpbmcgYXJnbmFtZSkKCQl7CgkJCXN1cGVyKGFyZ25hbWUpOwoJCX0KCX0KfQ==