結果
| 問題 |
No.916 Encounter On A Tree
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 18:49:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 54 ms / 2,000 ms |
| コード長 | 1,768 bytes |
| コンパイル時間 | 255 ms |
| コンパイル使用メモリ | 82,716 KB |
| 実行使用メモリ | 68,240 KB |
| 最終ジャッジ日時 | 2025-03-20 18:50:34 |
| 合計ジャッジ時間 | 4,572 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 56 |
ソースコード
import sys
import math
MOD = 10**9 + 7
def main():
d, l, r, k = map(int, sys.stdin.readline().split())
def get_depth(x):
if x == 0:
return 0
return x.bit_length()
i_l = get_depth(l)
if not ( (1 << (i_l -1)) <= l <= (1 << i_l) - 1 ):
print(0)
return
i_r = get_depth(r)
if not ( (1 << (i_r -1)) <= r <= (1 << i_r) - 1 ):
print(0)
return
if i_l > d or i_r > d:
print(0)
return
if i_l > i_r:
print(0)
return
total = (i_l + i_r - k)
if total % 2 != 0:
print(0)
return
d_LCA = total // 2
if d_LCA < 1 or d_LCA > i_l:
print(0)
return
max_fact_size = 1 << 20
factorial = [1] * (max_fact_size + 1)
for i in range(1, max_fact_size + 1):
factorial[i] = (factorial[i-1] * i) % MOD
if i_l > d_LCA and i_r > d_LCA:
exp = i_l + i_r - d_LCA - 2
C = pow(2, exp, MOD)
elif i_l == d_LCA:
exp = i_r - 1
C = pow(2, exp, MOD)
elif i_r == d_LCA:
exp = i_l - 1
C = pow(2, exp, MOD)
else:
C = 0
if C == 0:
print(0)
return
fact_m = 1
for i in range(1, d + 1):
m_i = 1 << (i-1)
if i == i_l and i != i_r:
term = factorial[m_i -1] if (m_i -1) >=0 else 1
elif i == i_r and i != i_l:
term = factorial[m_i -1] if (m_i -1) >=0 else 1
elif i == i_l and i == i_r:
term = factorial[m_i -2] if (m_i -2) >=0 else 1
else:
term = factorial[m_i]
fact_m = (fact_m * term) % MOD
ans = (C * fact_m) % MOD
print(ans)
if __name__ == "__main__":
main()
lam6er