/* *********************************************** Author :Stomach_ache Created Time :Sun 17 Jul 2016 06:14:59 PM CST File Name :B.cpp ************************************************ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus > 201103L #include #include #include #endif using namespace std; #define oo 0x3F3F3F3F #define PB push_back #define SZ(x) (int)((x).size()) #define ALL(x) (x).begin(), (x).end() #define FOR(i, a, b) for (int _end_ = (b), i = (a); i <= _end_; ++i) #define ROF(i, a, b) for (int _end_ = (b), i = (a); i >= _end_; --i) typedef unsigned int uint; typedef long long int64; typedef unsigned long long uint64; typedef long double real; int64 fpm(int64 b, int64 e, int64 m) { int64 t = 1; for (; e; e >>= 1, b = b * b % m) e & 1 ? t = t * b % m : 0; return t; } template inline bool chkmin(T &a, T b) {return a > b ? a = b, true : false;} template inline bool chkmax(T &a, T b) {return a < b ? a = b, true : false;} template inline T sqr(T x) {return x * x;} template T gcd(T x, T y) {for (T t; x; ) t = x, x = y % x, y = t; return y; } int c[100010]; void add(int x, int v) { while (x <= 100000) { c[x] += v; x += x & -x; } } int sum(int x) { int ret = 0; while (x > 0) { ret += c[x]; x -= x & -x; } return ret; } int B[100010], C[100010]; const int MOD = 998244353; int main(void) { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; scanf("%d", &T); for (int t = 1; t <= T; ++ t) { int n; scanf("%d", &n); for (int i = 1; i <= n; ++ i) { scanf("%d", B + i); } for (int i = 1; i <= n; ++ i) { scanf("%d", C + i); } memset(c, 0, sizeof(c)); for (int i = 1; i <= n; ++ i) { if (i == B[1]) continue; add(i, 1); } int lb = B[1], ub = C[1]; bool flag = (lb == ub ? true : false); int64 ans = 1; set s; for (int i = 1; i <= n; ++ i) if (i != B[1]) s.insert(i); for (int i = 2; i <= n && flag; ++ i) { if (B[i] > lb || C[i] < ub) { flag = false; break; } if (lb == B[i] && ub == C[i]) { ans = ans * (sum(ub) - sum(lb)) % MOD; int p = *s.upper_bound(lb); add(p, -1); s.erase(p); } else if (lb > B[i] && ub == C[i]) { add(B[i], -1); lb = B[i]; s.erase(B[i]); } else if (lb == B[i] && ub < C[i]) { add(C[i], -1); ub = C[i]; s.erase(C[i]); } else { flag = false; break; } } if (!flag) ans = 0; printf("%lld\n", ans); } return 0; }