結果

問題 No.2001 Distanced Triple
コンテスト
ユーザー LyricalMaestro
提出日時 2026-10-18 01:11:25
言語 PyPy3
(8.0.0 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 34 ms / 2,000 ms
+ 214µs
コード長 3,263 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 87 ms
コンパイル使用メモリ 64,872 KB
実行使用メモリ 53,848 KB
最終ジャッジ日時 2026-10-18 01:11:50
合計ジャッジ時間 3,637 ms
ジャッジサーバーID
(参考情報)
judge6_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

## https://yukicoder.me/problems/no/2001

MOD = 998244353

def sum_x2(R):
    ans = (R * (R + 1)) % MOD
    ans *= (2 * R + 1) % MOD
    ans %= MOD
    ans *= pow(6, MOD -2, MOD)
    ans %= MOD
    return ans

def sum_x1(R):
    ans = (R * (R + 1)) % MOD
    ans *= pow(2, MOD -2, MOD)
    ans %= MOD
    return ans

def sum_interval_x2(L, R):
    return (sum_x2(R) - sum_x2(L - 1) ) % MOD

def sum_interval_x1(L, R):
    return (sum_x1(R) - sum_x1(L - 1) ) % MOD

def sum_interval_x0(L, R):
    return (R - L + 1) % MOD

def case1(L, R, r, A, B, C):
    a1 = ((R + 1 - B) * (R - C)) % MOD
    a1 *= sum_interval_x0(L, r)
    a1 %= MOD

    a2 = -(R + 1 - B)
    a2 *= sum_interval_x1(L, r)
    a2 %= MOD

    a3 = ((R - B) * (R - B + 1)) % MOD
    a3 *= pow(2, MOD - 2, MOD)
    a3 %= MOD
    a3 *= -1
    a3 %= MOD
    a3 *= sum_interval_x0(L, r)
    a3 %= MOD

    a4 = pow(2, MOD -2 , MOD)
    a4 *= sum_interval_x2(L, r)
    a4 %= MOD

    a5 = ((2 * C - 2 * B + 1) * pow(2, MOD - 2, MOD)) % MOD
    a5 *= sum_interval_x1(L, r)
    a5 %= MOD

    a6 = ((C - B) * (C - B + 1)) % MOD
    a6 *= pow(2, MOD -2, MOD)
    a6 %= MOD
    a6 *= sum_interval_x0(L, r)
    a6 %= MOD

    a7 = ((C - B - A + 1) * (R - C + 1)) % MOD
    a7 *= sum_interval_x0(L, r)
    a7 %= MOD

    a8 = ((C - B - A + 1) * (-1)) % MOD
    a8 *= sum_interval_x1(L, r)
    a8 %= MOD

    answer = 0
    answer += a1
    answer %= MOD
    answer += a2
    answer %= MOD
    answer += a3
    answer %= MOD
    answer += a4
    answer %= MOD
    answer += a5
    answer %= MOD
    answer += a6
    answer %= MOD
    answer += a7
    answer %= MOD
    answer += a8
    answer %= MOD
    print(answer)

def case2(L, R, r, A, B, C):

    a1 = ((R + 1 - B) * (R - B - A + 1)) % MOD
    a1 *= sum_interval_x0(L, r)
    a1 %= MOD

    a2 = -(R + 1 - B)
    a2 *= sum_interval_x1(L, r)
    a2 %= MOD

    a3 = ((R - B) * (R - B + 1)) % MOD
    a3 *= pow(2, MOD - 2, MOD)
    a3 %= MOD
    a3 *= -1
    a3 %= MOD
    a3 *= sum_interval_x0(L, r)
    a3 %= MOD

    a4 = pow(2, MOD -2 , MOD)
    a4 *= sum_interval_x2(L, r)
    a4 %= MOD

    a5 = ((2 * A - 1) * pow(2, MOD - 2, MOD)) % MOD
    a5 *= sum_interval_x1(L, r)
    a5 %= MOD

    a6 = (A * (A - 1)) % MOD
    a6 *= pow(2, MOD -2, MOD)
    a6 %= MOD
    a6 *= sum_interval_x0(L, r)
    a6 %= MOD

    answer = 0
    answer += a1
    answer %= MOD
    answer += a2
    answer %= MOD
    answer += a3
    answer %= MOD
    answer += a4
    answer %= MOD
    answer += a5
    answer %= MOD
    answer += a6
    answer %= MOD
    print(answer)


def solve(L, R, A, B, C):
    r = R - max(A + B, C)
    if L > r:
        print(0)
        return

    if C - B - A >= 0:
        case1(L, R, r, A, B, C)
    else:
        case2(L, R, r, A, B, C)

def solve2(L, R, A, B, C):

    answer = 0
    for x in range(L, R + 1):

        if x + A <= R:
            for y in range(x + A, R + 1):
                if max(x + C, y + B) <= R:
                    z0 = max(x + C, y + B)
                    answer += R - z0 + 1
                    answer %= MOD
    print(answer)


def main():
    L, R = map(int, input().split())
    A, B, C = map(int, input().split())


    solve(L, R, A, B, C)
#    solve2(L, R, A, B, C)

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