結果
問題 |
No.916 Encounter On A Tree
|
ユーザー |
![]() |
提出日時 | 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()