/*
Copyright 2011 Marek "p2004a" Rusinowski
Matrix multiplication (class matrix)
*/
#include <cstdio>
#include <cstring>
#include <cassert>
class Matrix {
private :
static const int cmod = 1000000007 ;
int n_;
int * t_;
public :
Matrix( int n) : n_( n) , t_( new int [ n_ * n_] ) { }
Matrix( int n, const int * t) : n_( n) , t_( new int [ n_ * n_] ) {
memcpy ( t_, t, sizeof ( int ) * n_ * n_) ;
}
Matrix( const Matrix & obj) : n_( obj.n_ ) , t_( new int [ n_ * n_] ) {
memcpy ( t_, obj.t_ , sizeof ( int ) * n_ * n_) ;
}
~Matrix( ) {
delete t_;
}
Matrix & operator= ( const Matrix & obj) {
if ( & obj == this ) {
return * this ;
}
if ( obj.n_ ! = n_) {
delete t_;
n_ = obj.n_ ;
t_ = new int [ n_ * n_] ;
}
memcpy ( t_, obj.t_ , sizeof ( int ) * n_ * n_) ;
return * this ;
}
const Matrix operator* ( const Matrix & obj) {
assert ( obj.n_ == n_) ;
Matrix res( n_) ;
for ( int i = 0 ; i < n_; ++ i) {
for ( int k = 0 ; k < n_; ++ k) {
for ( int j = 0 ; j < n_; ++ j) {
* ( res.t_ + n_ * i + j) + = * ( t_ + n_ * i + k) * * ( obj.t_ + n_ * k + j) % cmod;
* ( res.t_ + n_ * i + j) % = cmod;
}
}
}
return res;
}
Matrix & operator* = ( const Matrix & obj) {
( * this ) = ( * this ) * obj;
return * this ;
}
const int * operator[ ] ( int i) {
return t_ + n_ * i;
}
} ;
void read_matrix( int n, int * t) {
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < n; ++ j) {
scanf ( "%d" , t + n * i + j) ;
}
}
}
int main( ) {
int n;
scanf ( "%d" , & n) ;
int * a = new int [ n * n] , * b = new int [ n * n] ;
read_matrix( n, a) ;
read_matrix( n, b) ;
Matrix A( n, a) , B( n, b) ;
A * = B;
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < n; ++ j) {
printf ( "%3d " , A[ i] [ j] ) ;
}
printf ( "\n " ) ;
}
delete a;
delete b;
return 0 ;
}
Ci8qCiAgQ29weXJpZ2h0IDIwMTEgTWFyZWsgInAyMDA0YSIgUnVzaW5vd3NraQogIE1hdHJpeCBtdWx0aXBsaWNhdGlvbiAoY2xhc3MgbWF0cml4KQoqLwojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNhc3NlcnQ+CgpjbGFzcyBNYXRyaXggewogcHJpdmF0ZToKICBzdGF0aWMgY29uc3QgaW50IGNtb2QgPSAxMDAwMDAwMDA3OwogIGludCBuXzsKICBpbnQgKnRfOwogIAogcHVibGljOgogIE1hdHJpeChpbnQgbikgOiBuXyhuKSwgdF8obmV3IGludCBbbl8gKiBuX10pIHt9CiAgCiAgTWF0cml4KGludCBuLCBjb25zdCBpbnQgKnQpIDogbl8obiksIHRfKG5ldyBpbnQgW25fICogbl9dKSB7CiAgICBtZW1jcHkodF8sIHQsIHNpemVvZihpbnQpICogbl8gKiBuXyk7CiAgfQogIAogIE1hdHJpeChjb25zdCBNYXRyaXggJm9iaikgOiBuXyhvYmoubl8pLCB0XyhuZXcgaW50IFtuXyAqIG5fXSkgewogICAgbWVtY3B5KHRfLCBvYmoudF8sIHNpemVvZihpbnQpICogbl8gKiBuXyk7CiAgfQogIAogIH5NYXRyaXgoKSB7CiAgICBkZWxldGUgdF87CiAgfQogIAogIE1hdHJpeCAmb3BlcmF0b3I9KGNvbnN0IE1hdHJpeCAmb2JqKSB7CiAgICBpZiAoJm9iaiA9PSB0aGlzKSB7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlmIChvYmoubl8gIT0gbl8pIHsKICAgICAgZGVsZXRlIHRfOwogICAgICBuXyA9IG9iai5uXzsKICAgICAgdF8gPSBuZXcgaW50IFtuXyAqIG5fXTsKICAgIH0KICAgIG1lbWNweSh0Xywgb2JqLnRfLCBzaXplb2YoaW50KSAqIG5fICogbl8pOwogICAgcmV0dXJuICp0aGlzOwogIH0KICAKICBjb25zdCBNYXRyaXggb3BlcmF0b3IqKGNvbnN0IE1hdHJpeCAmb2JqKSB7CiAgICBhc3NlcnQob2JqLm5fID09IG5fKTsKICAgIE1hdHJpeCByZXMobl8pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuXzsgKytpKSB7CiAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbl87ICsraykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbl87ICsraikgewogICAgICAgICAgKihyZXMudF8gKyBuXyAqIGkgKyBqKSArPSAqKHRfICsgbl8gKiBpICsgaykgKiAqKG9iai50XyArIG5fICogayArIGopICUgY21vZDsKICAgICAgICAgICoocmVzLnRfICsgbl8gKiBpICsgaikgJT0gY21vZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7CiAgfQogIAogIE1hdHJpeCAmb3BlcmF0b3IqPShjb25zdCBNYXRyaXggJm9iaikgewogICAgKCp0aGlzKSA9ICgqdGhpcykgKiBvYmo7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIAogIGNvbnN0IGludCAqb3BlcmF0b3JbXShpbnQgaSkgewogICAgcmV0dXJuIHRfICsgbl8gKiBpOwogIH0KfTsKCnZvaWQgcmVhZF9tYXRyaXgoaW50IG4sIGludCAqdCkgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgewogICAgICBzY2FuZigiJWQiLCB0ICsgbiAqIGkgKyBqKTsKICAgIH0KICB9Cn0KCmludCBtYWluKCkgewogIGludCBuOwogIHNjYW5mKCIlZCIsICZuKTsKICBpbnQgKmEgPSBuZXcgaW50IFtuICogbl0sICpiID0gbmV3IGludCBbbiAqIG5dOwogIHJlYWRfbWF0cml4KG4sIGEpOwogIHJlYWRfbWF0cml4KG4sIGIpOwogIE1hdHJpeCBBKG4sIGEpLCBCKG4sIGIpOwogIEEgKj0gQjsKICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgcHJpbnRmKCIlM2QgIiwgQVtpXVtqXSk7CiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgfQogIGRlbGV0ZSBhOwogIGRlbGV0ZSBiOwogIHJldHVybiAwOwp9Cg==
compilation info
prog.cpp: In function ‘void read_matrix(int, int*)’:
prog.cpp:71: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
prog.cpp: In function ‘int main()’:
prog.cpp:78: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
stdout