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 <bits/stdc++.h>
#define MOD 1000000007

using namespace std;

typedef long long ll;

inline void update(int &x,ll y) {
  x=(x+y)%MOD;
}

int f[2][305][305];
int num[605],kind[605];

int main() {
  int n;
  scanf("%d",&n);
  for(int i=1;i<=2*n;i++) scanf("%d",&num[i]);
  int cnt=0;
  for(int i=1;i<=n;i++)
    if (num[2*i-1]==-1||num[2*i]==-1) {
    	if (num[2*i-1]!=-1) kind[num[2*i-1]]=1;
    	if (num[2*i]!=-1) kind[num[2*i]]=1;
    	if (num[2*i-1]==-1&&num[2*i]==-1) cnt++;
	}
	else kind[num[2*i-1]]=kind[num[2*i]]=-1;
  int cur=0;
  f[cur][0][0]=1;
  int s1=0,s2=0;
  for(int i=2*n;i>0;i--)
    if (kind[i]!=-1) {
    	cur^=1;
    	memset(f[cur],0,sizeof(f[cur]));
    	for(int j=0;j<=min(s1,n);j++)
    	  for(int k=0;k<=min(s2,n);k++)
    	    if (f[cur^1][j][k]) {
    	    	if (kind[i]) {
    	    		if (j<n) update(f[cur][j+1][k],f[cur^1][j][k]);
    	    		if (k) update(f[cur][j][k-1],f[cur^1][j][k]);
				}
				else {
					if (k<n) update(f[cur][j][k+1],f[cur^1][j][k]);
					if (j) update(f[cur][j-1][k],(ll)j*f[cur^1][j][k]);
					if (k) update(f[cur][j][k-1],(ll)(cnt-((s2-s1+j-k)>>1))*f[cur^1][j][k]);
				}
			}
		if (kind[i]) s1++; else s2++;
	}
  printf("%d\n",f[cur][0][0]);
  return 0;
}