結果
| 問題 |
No.2406 Difference of Coordinate Squared
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 20:52:57 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,289 bytes |
| コンパイル時間 | 190 ms |
| コンパイル使用メモリ | 81,736 KB |
| 実行使用メモリ | 91,676 KB |
| 最終ジャッジ日時 | 2025-06-12 20:57:09 |
| 合計ジャッジ時間 | 4,521 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 1 TLE * 1 -- * 53 |
ソースコード
import math
MOD = 998244353
def main():
import sys
input = sys.stdin.read().split()
N = int(input[0])
M = int(input[1])
max_n = N
fact = [1] * (max_n + 1)
for i in range(1, max_n + 1):
fact[i] = fact[i-1] * i % MOD
inv_fact = [1] * (max_n + 1)
inv_fact[max_n] = pow(fact[max_n], MOD-2, MOD)
for i in range(max_n - 1, -1, -1):
inv_fact[i] = inv_fact[i+1] * (i+1) % MOD
def comb(n, k):
if k < 0 or k > n:
return 0
return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD
pow4 = pow(4, N, MOD)
inv_pow4 = pow(pow4, MOD-2, MOD)
total = 0
for k in range(-N, N + 1):
l_squared = k * k - M
if l_squared < 0:
continue
l = math.isqrt(l_squared)
if l * l != l_squared:
continue
for l_val in [l, -l]:
if abs(l_val) > N:
continue
if (k + l_val) % 2 != N % 2:
continue
a_min = max(abs(k), 0)
a_max = min(N - abs(l_val), N)
if a_min > a_max:
continue
parity = k % 2
a_start = a_min if (a_min % 2 == parity) else a_min + 1
if a_start > a_max:
continue
# Iterate through possible a values
a = a_start
while a <= a_max:
b = N - a
if abs(l_val) > b:
a += 2
continue
if (l_val % 2) != (b % 2):
a += 2
continue
x = (a + k) // 2
if x < 0 or x > a:
a += 2
continue
y = (b + l_val) // 2
if y < 0 or y > b:
a += 2
continue
# Compute combinations
c_n_a = comb(N, a)
c_a_x = comb(a, x)
c_b_y = comb(b, y)
contribution = c_n_a * c_a_x % MOD
contribution = contribution * c_b_y % MOD
total = (total + contribution) % MOD
a += 2
ans = total * inv_pow4 % MOD
print(ans)
if __name__ == '__main__':
main()
gew1fw