def solve(a, b, c, n): a, b, c = sorted((a, b, c)) assert 1 <= a < b < c if c == 3: return n >> 2 ans = 0 n0 = n # while n > 0: # if n0 - n >= 30: # print(a,b,c,n0) # exit(0) # nn = n - 1 # while nn >= 0: # if n ^ nn != a and n ^ nn != b and n ^ nn != c: # ans += 1 # break # nn -= 1 # if nn <= 0: # return ans # if n - nn == 1: # n = nn # break # n = nn ans += n for x in a, b, c: if x & (x + 1) != 0: continue x = (x + 1) >> 1 # x + 2x t <= n if n >= x: ans -= (n - x) // (2 * x) + 1 return ans # else: # ans -= (n - 1) // 2 + 1 # c += 1 # ans -= for k in range(60): # 2^k + 2^(k+1)x <= n if 1 << k > n: break cnt = ((n - (1 << k)) >> (k + 1)) + 1 v = 1 << k skip = 0 nv = v - 1 while nv >= 0: if v ^ nv != a and v ^ nv != b and v ^ nv != c: break skip += 1 nv -= 1 print(k,cnt,skip) ans -= cnt * skip return ans n, a, b, c = map(int, input().split()) print(solve(a, b, c, n)) # print(solve(1,6,7,6)) exit(0) for a in range(1, 130): for b in range(a, 130): for c in range(b, 130): if a ^ b ^ c != 0: continue assert a < b < c dp = [0] * 200 for i in range(1, 200): dp[i] = max((dp[j] + 1 for j in range(i) if j^i != a and j^i != b and j^i != c), default=0) for i in range(1, 200): i0 = i cnt = 0 while i > 0: ni = i-1 while ni >= 0: if i^ni != a and i^ni != b and i^ni != c: cnt += 1 break ni -= 1 i = ni if c == 3: assert dp[i0] == i0 >> 2 if dp[i0] != solve(a,b,c,i0): print(a, b, c, i0, dp[i0], cnt, solve(a,b,c,i0)) exit(0)