import sys
# Tăng giới hạn đệ quy cho an toàn, dù độ sâu cây chỉ khoảng 60
sys.setrecursionlimit(2000)
def solve():
# Đọc dữ liệu từ input chuẩn (hoặc thay bằng giá trị cụ thể để test)
# Ví dụ input: 10 2
try:
line = sys.stdin.readline()
if not line:
return
parts = list(map(int, line.split()))
if len(parts) < 2:
return
n = parts[0]
k = parts[1]
except ValueError:
return
# Nếu k = 0, theo định nghĩa đường đi 0 cạnh là 1 điểm, có n đường.
# Nhưng thường bài toán đường đi k cạnh yêu cầu k > 0.
if k == 0:
print(n)
return
# Cache cho các cây con hoàn hảo
# perfect_memo[h] lưu số đường đi độ dài k trong một cây nhị phân hoàn hảo chiều cao h
perfect_memo = {}
def get_perfect_paths(h):
if h < 0: return 0
if h in perfect_memo:
return perfect_memo[h]
# Nếu chiều cao cây nhỏ hơn k, không thể chứa đường đi độ dài k?
# Không hẳn, đường đi có thể ngắn hơn chiều cao cây.
# Nhưng ở đây ta đếm đường đi CÓ ĐỘ DÀI ĐÚNG BẰNG k.
# Nếu h < k/2 (xấp xỉ), có thể không có, nhưng để đơn giản ta dùng công thức đệ quy.
# Công thức: Tổng đường đi trong cây con trái + cây con phải + đường đi qua gốc
# Trong cây hoàn hảo, cây con trái và phải đều là cây hoàn hảo chiều cao h-1.
cnt = 2 * get_perfect_paths(h - 1)
# Cộng thêm các đường đi nhận gốc làm LCA
# 1. Đi thẳng xuống 1 nhánh k bước (chỉ khi h >= k)
# Có 2 nhánh (trái/phải). Mỗi nhánh tại độ sâu k có 2^k nút (nếu gốc là độ sâu 0).
# Trong cây hoàn hảo, số nút ở độ sâu d là 2^d.
if h >= k:
# Gốc -> trái -> ... (k cạnh): có 2^(k-1) đường (vì nút đích ở độ sâu k so với gốc)
# SAI. Nút đích ở độ sâu k. Có 2^k nút ở độ sâu k? Không.
# Trong cây hoàn hảo, ở độ sâu d có 2^d nút.
# Đường đi từ gốc đến 1 nút ở độ sâu k là duy nhất cho mỗi nút đích.
# Vậy có 2^k nút đích -> 2^k đường đi bắt đầu từ gốc?
# Không, từ gốc đi xuống k bước.
# Nút ở độ sâu k có 2^k cái. Mỗi cái tương ứng 1 đường đi từ gốc.
# Vậy có 2^k đường đi bắt đầu từ gốc có độ dài k.
pass
# Tính chính xác phần đi qua gốc (LCA):
# Chia k bước thành: x bước bên trái, k-x bước bên phải.
# x chạy từ 0 đến k.
# Nếu x=0: Gốc -> Phải k bước. Số cách = số nút ở độ sâu k-1 bên nhánh phải = 2^(k-1). (Điều kiện k <= h)
# Nếu x=k: Gốc -> Trái k bước. Số cách = số nút ở độ sâu k-1 bên nhánh trái = 2^(k-1). (Điều kiện k <= h)
# Nếu 0 < x < k: Trái (x bước) và Phải (k-x bước).
# Số cách = (nút sâu x-1 bên trái) * (nút sâu k-x-1 bên phải)
# = 2^(x-1) * 2^(k-x-1) = 2^(k-2).
# Điều kiện: x <= h và k-x <= h.
ways_via_root = 0
# Case đi thẳng 1 nhánh (x=0 hoặc x=k)
if h >= k:
ways_via_root += 2 * (2**(k-1)) # 2 nhánh, mỗi nhánh 2^(k-1) đích
# Case rẽ 2 nhánh (0 < x < k)
# Cần đếm số lượng x sao cho: 1 <= x <= k-1 AND x <= h AND k-x <= h
# Tức là: max(1, k-h) <= x <= min(k-1, h)
low = max(1, k - h)
high = min(k - 1, h)
if low <= high:
count_valid_splits = high - low + 1
ways_via_root += count_valid_splits * (2**(k-2))
cnt += ways_via_root
perfect_memo[h] = cnt
return cnt
# Hàm đếm số nút trong cây con gốc u ở độ sâu d (tương đối)
def count_nodes_at_depth(u, d):
if d < 0: return 0
if d == 0: return 1
# Nút đầu tiên và cuối cùng ở độ sâu d trong cây con u
# Chỉ số toàn cục: [u * 2^d, u * 2^d + 2^d - 1]
# Cần dùng bit shift cẩn thận để tránh tạo số quá lớn không cần thiết,
# nhưng Python xử lý BigInt tốt.
# Kiểm tra nhanh: nếu u quá lớn so với n thì 0
# u * 2^d > n
# Bit length check
if u.bit_length() + d > n.bit_length() + 1: # ước lượng
return 0
first = u << d
if first > n:
return 0
last = first + (1 << d) - 1
if last <= n:
return (1 << d)
else:
return max(0, n - first + 1)
total_paths = 0
# Hàm duyệt cây
def traverse(u):
nonlocal total_paths
if u > n:
return
# 1. Tính đóng góp của u với tư cách là LCA
# Ta cần tính tổng: count(left, x-1) * count(right, k-x-1)
# Tối ưu: count_nodes_at_depth thực ra tốn chi phí log.
# Vòng lặp k lần. Tổng chi phí O(k * log n).
# Với k lớn, ta có thể tối ưu hơn, nhưng thường k <= 60-100 trong các bài toán cây này.
# Nếu k quá lớn (> 120), số đường đi là 0 (vì chiều cao cây ~ 60).
if k > 130: # Chiều cao cây 10^18 < 60. Đường đi tối đa ~ 120.
return
ways = 0
# Case: Gốc -> Trái x, Phải k-x
# x = 0: Gốc -> Phải k
# x = k: Gốc -> Trái k
# Pre-calculate counts to avoid re-calling logic?
# No, direct is fine.
# Loop x from 0 to k
for x in range(k + 1):
left_len = x
right_len = k - x
c_left = 0
c_right = 0
# Left branch contribution
if left_len == 0:
c_left = 1 # Đại diện chính nút u
else:
c_left = count_nodes_at_depth(2*u, left_len - 1)
if c_left == 0: continue
# Right branch contribution
if right_len == 0:
c_right = 1
else:
c_right = count_nodes_at_depth(2*u + 1, right_len - 1)
if c_right > 0:
if left_len == 0 and right_len == 0:
continue # Độ dài 0, không tính (hoặc tính là 0 đường)
# Lưu ý: nếu left_len > 0 và right_len > 0 thì đây là đường đi ghép
# Nếu 1 trong 2 bằng 0 thì là đường đi thẳng.
# Logic count_nodes đã đếm số nút đích. Mỗi nút đích ứng với 1 đường đi duy nhất từ u.
# Nên ta nhân số lượng đích.
ways += c_left * c_right
total_paths += ways
# 2. Kiểm tra xem cây con hiện tại có phải là cây hoàn hảo không để cắt tỉa
# Kiểm tra cây hoàn hảo "đủ lớn" để chứa các đường đi còn lại
# Thực ra chỉ cần kiểm tra: cây con u có phải là cây hoàn hảo chiều cao H nào đó không.
# Cách kiểm tra:
# Nút u có chiều cao H trong cây hoàn hảo nếu:
# (u << H) + (1 << H) - 1 <= n (Nút phải cùng lớp H nằm trong n)
# VÀ (u << (H+1)) > n (Lớp H+1 không có nút nào - tức là cây kết thúc chính xác tại H)
# Tìm chiều cao tối đa có thể của u
# Max depth của toàn bộ cây ~ 60
# Ta thử tìm H sao cho cây con u là cây hoàn hảo chiều cao H
# Ước lượng chiều cao từ u đến đáy:
# bit_len(n) - bit_len(u)
h_est = n.bit_length() - u.bit_length()
# Kiểm tra h_est
if h_est >= 0:
# Kiểm tra xem có phải hoàn hảo chiều cao h_est không
right_leaf = (u << h_est) + (1 << h_est) - 1
next_left = u << (h_est + 1)
if right_leaf <= n and next_left > n:
# Chính xác là cây hoàn hảo chiều cao h_est
# Tuy nhiên, ta đã tính LCA tại u rồi.
# Ta cần cộng số đường đi nằm TRỌN trong con trái và con phải.
# get_perfect_paths(h_est) bao gồm cả đường đi qua LCA (gốc u).
# NÊN: ta cộng get_perfect_paths(h_est) rồi TRỪ đi phần LCA đã tính?
# Hay là return luôn?
# get_perfect_paths tính TOÀN BỘ đường đi trong cây con.
# Hàm traverse hiện tại đang tính LCA(u) rồi gọi đệ quy con.
# Nếu ta return get_perfect_paths(h_est) thì ta phải KHÔNG tính LCA(u) ở trên, hoặc trừ đi.
# Cách dễ nhất: Đừng tính LCA ở trên nếu phát hiện là cây hoàn hảo.
# Nhưng code đã tính rồi.
# Logic lại:
# Check perfect trước. Nếu perfect -> return DP.
# Nếu không -> Tính LCA, recurse.
pass
# Viết lại hàm traverse gọn hơn với logic check trước
def traverse_optimized(u):
nonlocal total_paths
if u > n: return
# Check perfect tree
h_est = n.bit_length() - u.bit_length()
is_perfect = False
if h_est >= 0:
right_leaf = (u << h_est) + (1 << h_est) - 1
next_left = u << (h_est + 1)
if right_leaf <= n and next_left > n:
total_paths += get_perfect_paths(h_est)
return
# Nếu không perfect (hoặc là perfect nhưng bị cắt cụt dưới), tính thủ công
# 1. LCA contribution
ways = 0
if k <= 130:
for x in range(k + 1): # x là số cạnh bên trái
# Nếu x=0: đi thẳng phải k cạnh.
# Nếu x=k: đi thẳng trái k cạnh.
# Nếu 0<x<k: trái x, phải k-x.
# Số cạnh bên trái là x => cần nút ở độ sâu x (tương đối u) ?
# Không, nút ở độ sâu x tương đối u là ĐẦU MÚT.
# Đường đi từ u đến nút độ sâu x có độ dài x.
# Vậy ta cần tìm số nút ở độ sâu x bên trái (tức là độ sâu x-1 tính từ con trái 2u).
count_L = 0
count_R = 0
if x == 0:
count_L = 1 # u
else:
count_L = count_nodes_at_depth(2*u, x - 1)
if count_L == 0: continue
if k - x == 0:
count_R = 1 # u
else:
count_R = count_nodes_at_depth(2*u + 1, (k - x) - 1)
if count_R > 0:
# Nếu cả 2 đều là u (k=0), ways += 1.
# Nhưng loop chạy 1 lần x=0. countL=1, countR=1 -> ways+=1. Đúng.
# Nếu k > 0.
# x=0: L=1, R=cnt(right, k-1). ways += cnt. Đúng (đường đi thẳng phải).
# x=k: L=cnt(left, k-1), R=1. ways += cnt. Đúng (đường đi thẳng trái).
# 0<x<k: ways += L * R. Đúng.
ways += count_L * count_R
# Trừ đi trường hợp x=0 và x=k đếm trùng u?
# Không. x=0 nghĩa là đường đi nằm hẳn bên phải u (bắt đầu từ u).
# x=k nghĩa là đường đi nằm hẳn bên trái u.
# Chúng là các tập đường đi rời nhau.
# Tuy nhiên, nếu k=0. Loop x=0. L=1, R=1. ways=1.
# Nhưng ở đầu ta đã handle k=0 -> n.
# Với k > 0, x=0 và x=k là các đường đi khác nhau.
# Nhưng lưu ý: Logic trên tính số cặp (u, v) hay số đường đi?
# Đường đi vô hướng.
# Cách tính trên là "đếm số đường đi có đỉnh cao nhất là u".
# Với x=0: Đường u -> ... -> v (bên phải). LCA là u.
# Với x=k: Đường u -> ... -> v (bên trái). LCA là u.
# Với 0<x<k: v1 <- ... <- u -> ... -> v2. LCA là u.
# Tất cả đều có LCA là u duy nhất. Không bị trùng.
pass
total_paths += ways
# 2. Recurse
traverse_optimized(2*u)
traverse_optimized(2*u + 1)
traverse_optimized(1)
print(total_paths)
if __name__ == '__main__':
solve()