inlinevoidmerge(int x, int y) { f[find(x)] = find(y); }
inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
intmain() { int n = __read() << 1; for (int i = 1; i <= n; ++i) f[i] = i; for (int i = 1; i <= n; ++i) { int u = __read(), v = __read();
if (in[v]) merge(in[v], i); else in[v] = i;
if (out[u]) merge(out[u], i); else out[u] = i; }
intans(1); for (int i = 1; i <= n; ++i) if (f[i] == i) ans = ans * 2 % mod; printf ("%d\n", ans); }
inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
int a[maxn], d[maxn], f[maxn]; int pre[maxn], suf[maxn];
inlineintadd(int x, int y) { x += y; if (x >= mod) return x - mod; return x; }
intmain() { int n = __read(); for (int i = 1; i <= n; ++i) { a[i] = __read() + 1; if (a[i] == i) returnputs("0"), 0; if (i > a[i]) { if (a[i] > 1) { if (d[a[i] - 1] == 2)returnputs("0"), 0; else d[a[i] - 1] = 1; } if (i < n) { if (d[i - 1] == 2)returnputs("0"), 0; else d[i - 1] = 1; } for (int j = a[i]; j < i - 1; ++j) { if (d[j] == 1) returnputs("0"), 0; else d[j] = 2; } } else { if (a[i] < n) { if (d[a[i] - 1] == 1) returnputs("0"), 0; else d[a[i] - 1] = 2; } if (i > 1) { if (d[i - 1] == 1) returnputs("0"), 0; else d[i - 1] = 2; } for (int j = i; j < a[i] - 1; ++j) { if (d[j] == 2) returnputs("0"), 0; else d[j] = 1; } } } f[1] = pre[1] = suf[1] = 1; for (int i = 1; i < n - 1; ++i) { if (d[i] == 1) for (int j = 1; j <= i + 1; ++j) f[j] = pre[j - 1]; else for (int j = i + 1; j; --j) f[j] = suf[j]; for (int j = 1; j <= i + 1; ++j) pre[j] = add(pre[j - 1], f[j]); for (int j = i + 1; j >= 1; --j) suf[j] = add(suf[j + 1], f[j]); } intans(0); for (int i = 1; i < n; ++i) ans = add(ans, f[i]); printf ("%d\n", ans); }
inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
int n, m, top; int a[maxn][maxn]; ll dx[maxn], dy[maxn], dk[maxn]; //to get the change in O(1) ll opt[maxn << 2], pos[maxn << 2], del[maxn << 2]; //handicraft stack,to store answers
inline ll g(int x, int y) { return dx[x] + dy[y] + dk[y - x + dlta] + a[x][y]; }
inline ll __read() { ll x(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
inline ll __read() { ll x(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
int id[maxn]; ll f[maxn][maxn]; ll s[maxn];
structNode { ll x, y; }t[maxn];
inlineboolcmp(int x, int y) { return s[x] < s[y]; }