Advertisement
Guest User

Untitled

a guest
Jun 1st, 2013
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.01 KB | None | 0 0
  1. def HighestPlace(k, N):
  2.     upper = 0
  3.     lower = 0
  4.     same_upper = k
  5.     same_lower = 2 ** N - 1 - k
  6.     for i in range(N):
  7.         if same_lower == 0:
  8.             return upper + same_upper
  9.         else:
  10.             total = 1 + same_upper + same_lower
  11.             lower += 1
  12.             same_lower -= 1
  13.             if same_lower % 2 == 0:
  14.                 lower += same_lower // 2
  15.                 same_lower //= 2
  16.                 lower += same_upper // 2
  17.                 same_upper //= 2
  18.             else:
  19.                 lower += (same_lower + 1) // 2
  20.                 same_lower //= 2
  21.                 lower += same_upper // 2
  22.                 same_upper = (same_upper + 1) // 2
  23.     return upper + same_upper
  24.  
  25. def LowestPlace(k, N):
  26.     upper = 0
  27.     lower = 0
  28.     same_upper = k
  29.     same_lower = 2 ** N - 1 - k
  30.     for i in range(N):
  31.         if same_upper > 0:
  32.             same_upper -= 1
  33.             upper += 1
  34.             if same_upper % 2 == 0:
  35.                 upper += same_upper // 2
  36.                 same_upper //= 2
  37.                 upper += same_lower // 2
  38.                 same_lower //= 2
  39.             else:
  40.                 upper += (same_upper + 1) // 2
  41.                 same_upper //= 2
  42.                 upper += same_lower // 2
  43.                 same_lower = (same_lower + 1) // 2
  44.         else:
  45.             return upper
  46.     return upper
  47.  
  48. def solve(num):
  49.     N, P = map(int, input().split())
  50.     ans1 = 0
  51.     ans2 = 2 ** N
  52.     ans1left = 0
  53.     ans1right = 2 ** N
  54.     while ans1right - ans1left > 1:
  55.         m = (ans1right + ans1left) // 2
  56.         if LowestPlace(m, N) < P:
  57.             ans1left = m
  58.         else:
  59.             ans1right = m
  60.     ans2left = 0
  61.     ans2right = 2 ** N
  62.     while ans2right - ans2left > 1:
  63.         m = (ans2right + ans2left) // 2
  64.         if HighestPlace(m, N) < P:
  65.             ans2left = m
  66.         else:
  67.             ans2right = m
  68.  
  69.     print("Case #", num, ": ", ans1left, " ", ans2left, sep='')
  70.  
  71. T = int(input())
  72. for num in range(1, T + 1):
  73.     solve(num)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement