Matrix Operation
struct matrix { int n ; vector < vector < int > > t ; matrix ( ) { } matrix ( int _n , int val ) { n = _n ; t . assign ( n , vector < int > ( n , val ) ) ; } matrix ( int _n ) { n = _n ; t . assign ( n , vector < int > ( n , 0 ) ) ; } matrix ( vector < vi > v ) { n = v . size ( ) ; t = v ; } matrix unit ( int _n ) { matrix ans = matrix ( _n , 0 ) ; for ( int i = 0 ; i < _n ; i ++ ) ans . t [ i ] [ i ] = 1 ; return ans ; } ///make sure to erase mod if not needed matrix operator * ( matrix b ) { matrix c = matrix ( n , 0 ) ; for ( int i = 0 ; i < n ; i ++ ) for ( int k = 0 ; k < n ; k ++ ) for ( int j = 0 ; j < n ; j ++ ) c . t [ i ] [ j ] = ( c . t [ i ] [ j ] + 1LL * t [ i ] [ k ] * b . t [ k ] [ j ] % mod ) % mod ; return c ; } matrix operator | ( matrix b ) { matrix c = matrix ( n , - inf ) ; for ( int i =...