1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include<bits/stdc++.h> using namespace std; #ifdef LOCAL #define debug(...) fprintf(stdout, ##__VA_ARGS__) #define debag(...) fprintf(stderr, ##__VA_ARGS__) #else #define debug(...) void(0) #define debag(...) void(0) #endif #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second
#define mo 998244353 #define N 810 int pw(int a, int b) { int ans = 1; while(b) { if(b & 1) ans *= a; a *= a; b >>= 1; ans %= mo; a %= mo; } return ans; } int pw(int a) { return pw(a, mo - 2); } int fac[N], inv[N], ifac[N]; void init(int n) { int i; for(i = fac[0] = 1; i <= n; ++i) fac[i] = fac[i-1] * i % mo; ifac[n] = pw(fac[n], mo-2); for(i = n - 1; i >= 0; --i) ifac[i] = ifac[i+1] * (i+1) % mo; for(i = 1; i <= n; ++i) inv[i] = ifac[i] * fac[i-1] % mo; } inline void Mod(int &a) { if(a >= mo || a <= -mo) a %= mo; if(a < 0) a += mo; } inline void Add(int &a, int b) { a += b; Mod(a); } inline void Mul(int &a, int b) { Mod(b); a *= b; Mod(a); } int n, m, i, j, k, T; int l[N], r[N], R[N << 1], L[N << 1], v[N << 1], ans, a[N], b[N], len[N << 1], Len[N], iLen[N]; int Lx[N], Rx[N], In[N][N << 1], Und[N][N << 1]; int f[N][N << 1], t, cnt, F[N << 1];
signed main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif
n = read(); init(n); for(i = 1; i <= n; ++i) L[i] = Lx[i] = read(), R[i] = Rx[i] = read(); for(i = 1; i <= n; ++i) Len[i] = R[i] - L[i], iLen[i] = pw(Len[i]); for(i = 1; i <= n; ++i) v[++k] = L[i], v[++k] = R[i]; sort(v + 1, v + 2 * n + 1); reverse(v + 1, v + 2 * n + 1); for(i = 2; i <= 2 * n; ++i){ if(v[i] != v[i - 1]) l[++m] = v[i], r[m] = v[i - 1], len[m] = r[m] - l[m]; } for(i = 1; i <= m; ++i) debug("[%lld %lld] %lld\n", l[i], r[i], len[i]); for(i = 1; i <= n; ++i) { int mn = 1e9, mx = 0; for(j = 1; j <= m; ++j) if(L[i] <= l[j] && R[i] >= r[j]) mn = min(mn, j), mx = max(mx, j); L[i] = mn; R[i] = mx; debug("(%lld %lld) %lld %lld\n", L[i], R[i], Len[i], iLen[i]); } for(i = 1; i <= n; ++i) for(j = 1; j <= m; ++j) { if(j < L[i]) In[i][j] = 0, Und[i][j] = 1; else if(j > R[i]) In[i][j] = Und[i][j] = 0; else { In[i][j] = len[j] * iLen[i] % mo; Und[i][j] = (l[j] - Lx[i]) * iLen[i] % mo; } } for(t = 1; t <= m; ++t) { auto work = [&] (int st, int o) -> void { for(i = st, cnt = 0; i <= n && i >= 1; i += o, ++cnt) { for(j = 0; j <= cnt; ++j) { Add(ans, In[i][t] * F[j] % mo * inv[j + 1] % mo); debug("%lld (%lld %lld)\n", In[i][t] * F[j] % mo * inv[j + 1] % mo, pw(2), 5 * pw(6)); } for(j = cnt; j >= 0; --j) Add(F[j + 1], F[j] * In[i][t]), Mul(F[j], Und[i][t]); Add(F[0], Und[i][t]); Add(F[1], In[i][t]);
debug("%lld : ", i); for(j = cnt + 1; j >= 0; --j) debug("%lld ", F[j]); debug("\n"); } }; memset(F, 0, sizeof(F)); F[0] = 0; work(n, -1); memset(F, 0, sizeof(F)); F[0] = 0; work(1, 1); } printf("%lld", ans); return 0; }
|