一、暴力解法1(只能过40%评测点)
解法思路:
1.这一层等于上一层的两个数相加
2.用一个数组保存上一层和这一层的数据
3.利用上一层的得到这一层的数据后,统计上一层的个数,把上一层的数据置为空,置空目的为了防止内存超限
4.然后每一层个数和加最后一层个数就是出现时候的数
count=0
a=[1]
total=0
n=int(input(""))
while a[len(a)-1]!=n:
start=len(a)-count-1
del a[0:start]
total+=start
start=0
a.append(1)
c=count
flag=False
while c!=0:
a.append(a[start]+a[start+1])
if a[len(a)-1]==n:
flag=True
break
c-=1
start+=1
if flag:
break
a.append(1)
count+=1
print(total+len(a))
二、暴力解法2(组合数——动态规划解决)代码未实现:
参考此篇博客:
https://blog.csdn.net/bell041030/article/details/88911180
解题的同时也要不断删除二维数组f当前计算的上上层,否则会内存超限
三、时间复杂度为 16 l o g n 16logn 16logn的解法
参考此篇博客:
https://blog.csdn.net/qq_53269123/article/details/122793295
n=0
def C(a,b):
res=1
i,j=a,1
while j<=b:
res=res*i/j
i-=1
j+=1
if res>n:
return res
return res
def check(k):
l=k*2
r=max(n,l)
while l<r:
mid=(l+r)//2
if C(mid,k)>=n:
r=mid
else:
l=mid+1
if C(r,k)!=n:
return False
print(r*(r+1)//2+k+1)
return True
if __name__=="__main__":
n=int(input())
for k in range(16,-1,-1):
if check(k):
break