#等于1+楼层(log_2(n^(1/j))或0,如果n=0定义d(n,j=1):return(n.位长度()-1)//j+1#找到唯一的非负整数x#这样x+x^j=n,如果不存在这样的x,则返回None定义find_x(n,j):如果(j==0):如果n>=1,则返回n-1,否则无lo=0;hi=2**d(n,j)while(lo!=hi):x=(lo+hi)//2y=x+x**j如果(y==n):返回xelif(y>n):hi=x其他:lo=x+1return无#生成所有非负整数对(j,x),使x+x^j=n定义find_j_x_pairs(n):#从技术上讲,n=0和n=2有无穷多#非负整数对(j,x),使x+x^j=n,#但假设每个j的x值都相同,#只生成j的最小可能值。如果(n==0):产量(1,0);返回如果(n==2):产量(0,1);返回对于范围(d(n))中的j:x=查找x(n,j)如果x不是None:产量(j,x)#返回307092(n)#如果search_depth不是None,则返回min(a307092(n),search_depth)#注意a307092(n)<=2*(d(n)-1)定义a307092(n,search_depth=无):如果search_depth为“无”:search_depth=2*(d(n)-1)if(n==1或search_depth==0):返回0return min((1+a307092(x,search_depth-1)for j,x in find_j_xpairs(n)))#返回[a307092(i)表示范围(1,n+1)中的i]#比上面列出的理解更有效定义all_a307092(n):a=[0]*n对于范围(1,n)中的i:a[i]=最小值((1+a[x-1]表示j,x表示findjx_pairs(i+1))返回ai=1对于y,总计a307092(10000):打印(str(i)+“”+str(y))i+=1