結果
| 問題 | No.3376 Rectangle in Circle |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-25 01:38:40 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 353 ms / 2,000 ms |
| コード長 | 2,496 bytes |
| 記録 | |
| コンパイル時間 | 214 ms |
| コンパイル使用メモリ | 84,828 KB |
| 実行使用メモリ | 146,428 KB |
| 最終ジャッジ日時 | 2026-05-25 01:38:46 |
| 合計ジャッジ時間 | 4,693 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
## https://yukicoder.me/problems/no/3376
MOD = 998244353
def solve_case_all_black(N):
dp = [0] * (N + 1)
for i in reversed(range(N)):
dp[i] = (N * pow(N - i, MOD - 2, MOD)) % MOD
dp[i] += dp[i + 1]
dp[i] %= MOD
return dp[0]
def solve(N, L, D):
if L % 2 != 0:
return solve_case_all_black(N)
d_map = {}
for i in range(N):
d = D[i]
d_map[d] = i
diameter_pair = 0
for i in range(N):
d = D[i]
d1 = (d + L // 2) % L
if d1 in d_map:
diameter_pair += 1
del d_map[d]
del d_map[d1]
if diameter_pair <= 1:
return solve_case_all_black(N)
# 異なる4つが存在して
rest_point = N - 2 * diameter_pair
dp1 = [0] * diameter_pair
dp1[diameter_pair - 1] = N * pow(N - (rest_point + diameter_pair + 1), MOD - 2, MOD)
dp1[diameter_pair - 1] %= MOD
for i in reversed(range(diameter_pair - 1)):
dp1[i] = N * pow(N - (rest_point + i + 2), MOD - 2, MOD)
dp1[i] %= MOD
p = 2 * (diameter_pair - 1 - i)
p %= MOD
p *= pow(N - (rest_point + i + 2), MOD - 2, MOD)
p %= MOD
p *= dp1[i + 1]
p %= MOD
dp1[i] += p
dp1[i] %= MOD
dp0 = [0] * (diameter_pair + 1)
dp0[diameter_pair] = N * pow(N - (rest_point + diameter_pair), MOD - 2, MOD)
dp0[diameter_pair] %= MOD
q = diameter_pair
q %= MOD
q *= pow(N - (rest_point + diameter_pair), MOD - 2, MOD)
q %= MOD
q *= dp1[diameter_pair - 1]
q %= MOD
dp0[diameter_pair] += q
dp0[diameter_pair] %= MOD
for i in reversed(range(diameter_pair)):
dp0[i] = N * pow(N - (rest_point + i), MOD - 2, MOD)
dp0[i] %= MOD
p = 2 * (diameter_pair - i)
p %= MOD
p *= pow(N - (rest_point + i), MOD - 2, MOD)
p %= MOD
p *= dp0[i + 1]
p %= MOD
dp0[i] += p
dp0[i] %= MOD
q = i
q %= MOD
q *= pow(N - (rest_point + i), MOD - 2, MOD)
q %= MOD
q *= dp1[i - 1]
q %= MOD
dp0[i] += q
dp0[i] %= MOD
return dp0[0]
def main():
T = int(input())
answers = []
for _ in range(T):
N, L = map(int, input().split())
D = list(map(int, input().split()))
ans = solve(N, L, D)
answers.append(ans)
for ans in answers:
print(ans)
if __name__ == "__main__":
main()