# 求组合数defC(a, b):# a为上限, b为下限
res =1for i inrange(a):
res *= b / a
# 当结果大于目标值时无需继续运算,提高效率if res > target:return res
b -=1
a -=1return res
# 二分查找目标元素defsearch(k):# 起始下限,也就是对称轴位置的元素
low =2* k
# 终点下限
high = target
# 可能出现high 小于 low 的情况,比如目标值很小,但行数还在十多行的时候。# 这时候直接判断该斜行第一个元素也就是对称轴位置的元素的值是否是目标值即可。if high <= low and C(k, low)!= target:returnFalsewhile low <= high:
mid = low +(high - low)//2
val = C(k, mid)if val > target:
high = mid -1elif val < target:
low = mid +1else:# 根据等差数列前N项和公式求出前面有多少个元素,然后再加上他所在的列数print(int(mid *(mid +1)/2)+ k +1)returnTruereturnFalse
target =int(input())# range第二个参数必须是-1,因为第0斜行才有1。for i inrange(16,-1,-1):if search(i):break
n=100
result=[[0for i inrange(n)]for j inrange(n)]
ans=[]for i inrange(n):for j inrange(i+1):if j==0:
result[i][j]=1elif i==j:
result[i][j]=1else:
result[i][j]=result[i-1][j-1]+result[i-1][j]
ans.append(result[i][j])
m=int(input())
a=ans.index(m)print(a+1)