Problem:
Score : 1600 points

Problem Statement

There is a sequence of length 2N: A_1, A_2, ..., A_{2N}.
Each A_i is either -1 or an integer between 1 and 2N (inclusive). Any integer other than -1 appears at most once in {A_i}.

For each i such that A_i = -1, Snuke replaces A_i with an integer between 1 and 2N (inclusive), so that {A_i} will be a permutation of 1, 2, ..., 2N.
Then, he finds a sequence of length N, B_1, B_2, ..., B_N, as B_i = min(A_{2i-1}, A_{2i}).

Find the number of different sequences that B_1, B_2, ..., B_N can be, modulo 10^9 + 7.

Constraints

1 \leq N \leq 300

A_i = -1 or 1 \leq A_i \leq 2N.

If A_i \neq -1, A_j \neq -1, then A_i \neq A_j. (i \neq j)

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_{2N}

Output

Print the number of different sequences that B_1, B_2, ..., B_N can be, modulo 10^9 + 7.

Sample Input 1

3
1 -1 -1 3 6 -1

Sample Output 1

5

There are six ways to make {A_i} a permutation of 1, 2, ..., 2N; for each of them, {B_i} would be as follows:

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 2, 4, 3, 6, 5): (B_1, B_2, B_3) = (1, 3, 5)

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 2, 5, 3, 6, 4): (B_1, B_2, B_3) = (1, 3, 4)

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 4, 2, 3, 6, 5): (B_1, B_2, B_3) = (1, 2, 5)

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 4, 5, 3, 6, 2): (B_1, B_2, B_3) = (1, 3, 2)

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 5, 2, 3, 6, 4): (B_1, B_2, B_3) = (1, 2, 4)

(A_1, A_2, A_3, A_4, A_5, A_6) = (1, 5, 4, 3, 6, 2): (B_1, B_2, B_3) = (1, 3, 2)

Thus, there are five different sequences that B_1, B_2, B_3 can be.

Sample Input 2

4
7 1 8 3 5 2 6 4

Sample Output 2

1

Sample Input 3

10
7 -1 -1 -1 -1 -1 -1 6 14 12 13 -1 15 -1 -1 -1 -1 20 -1 -1

Sample Output 3

9540576

Sample Input 4

20
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 -1 -1 -1 -1 -1 7 -1 -1 -1 -1 -1 -1 -1 -1 -1 34 -1 -1 -1 -1 31 -1 -1 -1 -1 -1 -1 -1 -1

Sample Output 4

374984201

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <cstdio>
#include <algorithm>

typedef long long LL;
const int Mod = 1000000007;
const int MN = 305;

inline void Add(int &x, int y) { x -= (x += y) >= Mod ? Mod : 0; }

int N, Z, A[MN * 2], B[MN * 2], C[MN * 2], D[MN * 2];
int f[MN][MN], g[MN][MN];

int main() {
	scanf("%d", &N);
	for (int i = 1; i <= 2 * N; ++i) {
		scanf("%d", &A[i]);
		if (~i & 1 && ~A[i] && ~A[i - 1]) C[A[i - 1]] = C[A[i]] = 1;
	}
	for (int i = 1; i <= 2 * N; ++i) D[i] = D[i - 1] + !C[i];
	for (int i = 1; i <= 2 * N; ++i) if (~A[i] && !C[A[i]]) B[D[A[i]]] = 1, --Z;
	Z += N = D[2 * N] / 2;
	f[0][0] = 1;
	for (int i = 1; i <= Z; ++i) f[0][0] = (LL)f[0][0] * i % Mod;
	for (int i = 2 * N; i >= 1; --i) {
		for (int j = 0; j <= N; ++j)
			for (int k = 0; k <= N - j; ++k)
				g[j][k] = 0;
		for (int j = 0; j <= N; ++j)
			for (int k = 0; j + k <= N; ++k)
				if (B[i]) {
					if (j) Add(g[j - 1][k], f[j][k]);
					if (j + k < N) Add(g[j][k + 1], f[j][k]);
				} else {
					if (j) Add(g[j - 1][k], f[j][k]);
					if (k) g[j][k - 1] = (g[j][k - 1] + (LL)f[j][k] * k) % Mod;
					if (j + k < N) Add(g[j + 1][k], f[j][k]);
				}
		std::swap(f, g);
	}
	printf("%d\n", f[0][0]);
	return 0;
}