結果

問題 No.3376 Rectangle in Circle
コンテスト
ユーザー tassei903
提出日時 2025-11-21 23:36:34
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,947 bytes
コンパイル時間 342 ms
コンパイル使用メモリ 82,404 KB
実行使用メモリ 111,028 KB
最終ジャッジ日時 2025-11-21 23:36:39
合計ジャッジ時間 4,479 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 14 WA * 6
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################

"""
a< b< c< d が長方形をなす

b - a = d - c
c - b = a - d

a + d = b + c
a + b = c + d
d - b = b - d
2b = 2d
2a = 2c

対角線が中心を通る

ペアが k 個と そうでないのが m 個あるときの答え

"""

mod = 998244353
nn = 3 * 10 ** 5
fact = [1] * nn
for i in range(nn - 1):
    fact[i + 1] = fact[i] * (i + 1) % mod
invfact = [1] * nn
invfact[nn - 1] = pow(fact[nn - 1], mod - 2, mod)
for i in range(nn - 1)[::-1]:
    invfact[i] = invfact[i + 1] * (i + 1) % mod
 
def binom(x, y):
    if x < 0 or y < 0 or x - y < 0:
        return 0
    return fact[x] * invfact[y] % mod * invfact[x - y] % mod

inv = [0] * nn
for i in range(1, nn):
    inv[i] = invfact[i] * fact[i-1] % mod

def g(n):
    ans = 0        
    for i in range(n):
        ans += inv[i+1]
        ans %= mod
    return ans * n % mod
"""
状態として、
(x, y) 
x = 0, 1
y = 0, ..., k

(x, y) から

x = 0 のとき
(2 * k - y * 2)/n の確率で

その状態になる確率 * その状態から抜け出せるまでの期待値
y/n で 何も起きない
y/n で (x + 1, y - 1)
(n - 2k) / n で何も起きない

x = 1
(2 * k - y * 2 - 2) / n で 

y / n で x = 

確率p のものを 得るまでの期待値
1/1 - (1 - p) = 1/p

"""


def solve(k, m):
    n = k * 2 + m

    p0 = [0] * (k + 1)
    p1 = [0] * (k + 1)
    p0[0] = 1
    for i in range(k + 1):
        if i < k:
            p0[i+1] += p0[i] * (2 * k - i * 2) % mod * inv[2 * k - i]  % mod
            p0[i+1] %= mod

        # print(i, 2 * k - i - 2)
        if i > 0:
            p1[i-1] += p0[i] * i % mod * inv[2 * k - i] % mod
            p1[i-1] %= mod
    
    for i in range(k):
        # print(i, p1[i], (2 * k - i * 2 - 2), 2 * k - i - 2)
        if i < k:
            p1[i+1] += p1[i] * (2 * k - i * 2 - 2) % mod * inv[2 * k - i - 2]  % mod
            p1[i+1] %= mod
    
    # print(n, m, k)
    # print([x * 9 % mod for x in p0])
    # print([x * 9 % mod for x in p1])
    ans = 0
    for i in range(k + 1):
        ans += p0[i] * inv[2 * k - i] % mod * n % mod
        ans %= mod

    for i in range(k + 1):
        ans += p1[i] * inv[2 * k - i - 2] % mod * n % mod
        ans %= mod
    # print(ans * 9 % mod)
    return ans

for _ in range(ni()):
    n, l = na()
    d = na()

    if l % 2:
        print(g(n))
    else:
        j = 0
        k = 0
        for i in range(n):
            while j < n and d[j] < d[i] + l // 2:
                j += 1
            if j < n and d[j] == d[i] + l // 2:
                k += 1
        
        if k <= 1:
            print(g(n))
        print(solve(k, n - 2 * k))
0