Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- long long mod = 998244353;
- vector <long long> fact;
- vector <long long> tcaf;
- const int MAXN = 1e6 + 1;
- long long cnk(int n, int k) {
- return fact[n] * tcaf[k] % mod * tcaf[n - k] % mod;
- }
- long long ans(int l, int r, vector <int> &left, vector <int> &right, map <pair <int, int>, int> &mp) {
- if (l == r) {
- return 1;
- }
- auto it = mp.find({l, r});
- if (it == mp.end()) {
- return 0;
- }
- int m = it->second;
- long long ans1 = ans(l, m, left, right, mp);
- long long ans2 = ans(m + 1, r, left, right, mp);
- return ans1 * ans2 % mod * cnk(r - l - 1, m - l) % mod;
- }
- void solve() {
- int n;
- cin >> n;
- vector <int> left(n), right(n);
- for (auto &i: left) {
- scanf("%d", &i);
- --i;
- }
- for (auto &i: right) {
- scanf("%d", &i);
- --i;
- }
- map <pair <int, int>, int> mp;
- for (int i = 0; i < n; ++i) {
- mp[{left[i], right[i] + 1}] = i;
- }
- int a = ans(0, n, left, right, mp);
- printf("%d\n", a);
- }
- long long binpow(long long a, long long n) {
- if (n == 0) {
- return 1;
- }
- long long ans = binpow(a, n / 2);
- ans = ans * ans % mod;
- if (n % 2 == 1) {
- ans = ans * a % mod;
- }
- return ans;
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- fact.resize(MAXN);
- tcaf.resize(MAXN);
- fact[0] = 1;
- tcaf[0] = 1;
- for (int i = 1; i < MAXN; ++i) {
- fact[i] = fact[i - 1] * i % mod;
- tcaf[i] = binpow(fact[i], mod - 2);
- }
- int t;
- scanf("%d", &t);
- for (int i = 0; i < t; ++i) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement