Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 16;
- int clr[ N ][ N ][ 2 ];
- int dp[ 2 ][ 1 << N ];
- int main() {
- ios_base::sync_with_stdio( false );
- cin.tie( nullptr );
- int n, mod; cin >> n >> mod;
- auto sets = [ n ] ( int s, int p, int x ) {
- if ( p < 0 ) return s;
- return x ? ( s | ( 1 << p ) ) : ( s & ( ( 1 << n ) - 1 - ( 1 << p ) ) );
- };
- auto adde = [ mod ] ( int& a, int b ) {
- a += b; if ( a >= mod ) a -= mod;
- };
- for ( int i = 0 ; i < n ; ++ i )
- for ( int j = 0 ; j < n ; ++ j )
- for ( int _ = 0 ; _ < 2 ; ++ _ )
- cin >> clr[ i ][ j ][ _ ];
- const int n2 = 1 << n;
- int me = 0, he = 1;
- dp[ he ][ 0 ] = dp[ he ][ 1 ] = 1;
- for ( int i = 0 ; i < n ; ++ i ) {
- for ( int j = 0 ; j < n ; ++ j ) {
- if ( not i and not j ) continue;
- for ( int s = 0 ; s < n2 ; ++ s ) {
- int cur_color = clr[ i ][ j ][ ( s >> j ) & 1 ];
- if ( j and clr[ i ][ j - 1 ][ ( s >> ( j - 1 ) ) & 1 ] == cur_color )
- continue;
- for ( int _ = 0 ; _ < 2 ; ++ _ )
- if ( cur_color != ( i ? clr[ i - 1 ][ j ][ _ ] : -1 ) )
- adde( dp[ me ][ s ], dp[ he ][ sets( s, j, _ ) ] );
- }
- memset( dp[ he ], 0, sizeof( dp[ he ] ) );
- swap( me, he );
- }
- }
- int ans = 0;
- for ( int s = 0 ; s < n2 ; ++ s )
- adde( ans, dp[ he ][ s ] );
- cout << ans << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement