結果

問題 No.2336 Do you like typical problems?
ユーザー lam6er
提出日時 2025-03-26 16:00:39
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,840 ms / 2,000 ms
コード長 2,388 bytes
コンパイル時間 307 ms
コンパイル使用メモリ 82,240 KB
実行使用メモリ 189,896 KB
最終ジャッジ日時 2025-03-26 16:01:34
合計ジャッジ時間 13,580 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 18
権限があれば一括ダウンロードができます

ソースコード

diff #

MOD = 998244353

def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx])
    idx += 1
    intervals = []
    for _ in range(N):
        B = int(input[idx])
        C = int(input[idx+1])
        idx += 2
        intervals.append((B, C))
    
    # Compute factorial of N mod MOD
    factorial_N = 1
    for i in range(2, N+1):
        factorial_N = factorial_N * i % MOD
    
    inv_2 = (MOD + 1) // 2  # 499122177
    
    # Precompute inv_len and inv_len_sq for each interval
    events = dict()
    for B, C in intervals:
        L = B
        R = C
        len_i = R - L + 1
        inv_len = pow(len_i, MOD-2, MOD)
        inv_len_sq = inv_len * inv_len % MOD
        
        # Event for B (start)
        x = L
        delta_S = inv_len
        delta_T = inv_len_sq
        if x not in events:
            events[x] = [0, 0]
        events[x][0] = (events[x][0] + delta_S) % MOD
        events[x][1] = (events[x][1] + delta_T) % MOD
        
        # Event for C+1 (end)
        x = C + 1
        delta_S = (-inv_len) % MOD
        delta_T = (-inv_len_sq) % MOD
        if x not in events:
            events[x] = [0, 0]
        events[x][0] = (events[x][0] + delta_S) % MOD
        events[x][1] = (events[x][1] + delta_T) % MOD
    
    # Sort events by x
    sorted_events = sorted(events.items())
    
    sum_total = 0
    prev_x = 0
    current_S = 0
    current_T = 0
    for x, (delta_S, delta_T) in sorted_events:
        if x > prev_x:
            length = x - prev_x
            # Compute contribution for [prev_x, x)
            S_sq = current_S * current_S % MOD
            S_sq_minus_T = (S_sq - current_T) % MOD
            contribution = S_sq_minus_T * inv_2 % MOD
            contribution = contribution * length % MOD
            sum_total = (sum_total + contribution) % MOD
        # Apply deltas
        current_S = (current_S + delta_S) % MOD
        current_T = (current_T + delta_T) % MOD
        prev_x = x
    
    # Compute term = N*(N-1)/2 mod MOD
    if N < 2:
        term = 0
    else:
        term = (N % MOD) * ((N-1) % MOD) % MOD
        term = term * inv_2 % MOD
    
    sum_part = (term - sum_total) % MOD
    
    # Answer is (factorial_N * inv_2) * sum_part mod MOD
    factor = factorial_N * inv_2 % MOD
    answer = factor * sum_part % MOD
    print(answer)

if __name__ == "__main__":
    main()
0