本网站由以下捐款支持:OEIS基金会.

用户:M.F.Hasler/A307511

来自OeisWiki
跳转到:航行,搜索

第一个值和定义

序列A307511型启动0、1、2、222、22、2222、3、120、10、234。。。

下一项是之前未使用的最小a(n+1),因此它与a(n)的串联具有比前一项严格大的最小可能的不同“子数”。这里,a子编号是一个数字子串:前导零被忽略,数字/字符必须从完整字符串中连续取值。

示例

  • a(0)=0和a(1)=1:“0”。“1”=“01”有2个子编号:0和1(=01)。
  • a(2)=2:“1”。“2”=“12”有3个子编号:1、2和12。
  • "2".“222”=“2222”有4个不同的子编号:2、22、222和2222。如果我们附加任何其他单个数字(或22),它会再次生成3个不同的子字符串,不会比以前多。如果我们将另一个数字附加两次(例如,11=>211),我们会得到5个不同的数字子字符串,这不是最小值。
  • "222".“22”=“22222”有5个不同的子编号:2、22、222和2222。
  • "22".“2222”=“222222”有6个不同的子编号:2、22、222、2222、22222和222222。
由于已经使用了“2”和“22”,因此不可能产生带有7或8个子数字的数字。
“0”和“1”也出现得更早,因此接下来可能出现的最小项是a(6)=3:
  • "2222".“3”=“22223”有9个不同的子编号:2、22、222、2222和3、23、223、2223、22223。

程序

C++

#包括<bits/stdc++.h>使用命名空间标准;int调试=0;char buf[99];typedef unsigned long long ull;//就我们的目的而言,足够大和足够有效//这是另一种变体,使用字符串进行双重检查。int ns(char*s){集合<ull>s;//if(debug>2)cerr<<“输入n()with s=”<<s<<endl;对于(;*s;++s){ull n=*s-“0”;S.插入(n);如果(n)for(字符*e=s+1;*e;++e)S.insert(n=n*10+(*e-“0”));}返回S.size();}//我们可以假设N至少有两个非零数字。我们永远不会有N=10^k。int n(ull n){集合<ull>S;//if(debug>2)cerr<<“输入n()with s=”<<s<<endl;对于(ull M=1;M<=N;){ull O=M;M*=10;ull n=n%M;如果(n<O)//此n之前已经处理过,M较小S.插入(0);其他的插入S.(n);而(n/=10);}返回S.size();}main(int argc,char**argv){整数N=2;向量<ull>a={1};设置<ull>U;/*“已用”号码*/向量<int>给定索引;向量<ull>given_values;全停=0;多集跳转={/*5,5,19,23,31,43*/};/*在该指数结束后,再次增加N*/for(int i=0;++i<argc;)交换机(*argv[i]==“-”?*++argv[i]:*argv[i]){案例'a':给定索引.push_back(atoi(是数字(argv[i][1]))?argv[i]+1:argv[++i]);given_values.push_back(环礁(argv[++i]));断裂;大小写':调试=(argv[i][1]?atoi(argv[1]+1):1);断裂;案例n:字符*s=(argv[i][1]?argv[i]+1:argv[++i]);cout<<“n(”<<s<<“)=”<<n(环礁)<<“(方法1:基于整数)\n”;cout<<“=?=”<<ns(s)<<“(方法2:基于字符串)\n”;断裂;case'h':printf(“用法:%s[OPTIONS][JUMPS],其中OPTIONS位于:\n”“\t[-]d<debug_level>|[-]{h[elp]|u[sage]}|[-]n<number>\n”“\t[-]a<index><value>|[-]{x|q[uit]}|[-]s[top]<value>\n”破折号是可选的。选项d、n、s的参数前面可以加空格。\n选项-nx使用两种不同的方法打印给定x的n(x)(不同子字符串的数目)。\n“-a选项允许指定给定索引的结果(旁路计算)。\n”“-s选项允许在达到给定值时停止(结束计算并退出)。\n”“附加参数[JUMPS]将给定索引中n(x)的搜索下限增加+1。\n”,argv[0]);//通过并退出case'q':case'x':退出(0);案例':STOP=环礁(是数字(argv[i][1])?argv[i]+1:argv[++i]);断裂;case'j':如果(是数字(argv[i][1]))++argv[i;else++i;默认值:jump.insert(atoll(argv[i]));//允许添加其他跳转作为参数}用于(;;){ull an=a.back();U.插入(a);//添加到“已用数字”;打印://int L=冲刺(buf,“%llu”,an);printf(“/*%d(N=%d)*/%llu,”,a.大小(),N,an);fflush(标准输出);如果(an==STOP)返回0;//为了时间安排//需要更多子字符串。N+=1+跳跃计数(.size());if(!given_indexs.empty()&&a.size()+1==给定索引[0]){如果(调试)cerr<<“/*使用给定值:*/”,则fflush(stderr);given_indexs.erase(given_Indexs.begin());a.回推(给定值[0]);given_values.erase(given_values.begin());//这里我们可以检查是否需要增加N继续;//转到下一个索引。}重新启动:auto next_Used=U.begin();//下一个要跳过的数字//如果给定长度的所有数字导致n值大于n//那么我们可以肯定,当我们增加数字的长度时,我们找不到更少的int n_min=int_MAX;ull next_MAX=10//这是下一个更长的整数prefix=一个*next_MAX;//避免循环中的这种乘法会使速度提高约10%对于(ull k=1;;++k){如果(k==next_MAX){//不经常发生,则下面不需要优化if(n_min>n&&(!U.count(k/9*(an%10))||n(an*next_MAX+k/9*{//如果“最后一位数的n倍”为U,则不增加++N;cerr<<“/*将N增加到”<<N<<“*/”,fflush(stderr);转到重新启动;}下一个最大值*=10;n_min=内部最大值;前缀*=10;if(debug>1)cerr<<“/*next_max=”<<next_max<<“*/\n”;}if(k==*next_Used){//数字已使用if(++next_Used==U.end())next_Used=U.begin();//它永远不会再平等了}其他{//冲刺f(buf+L,“%llu”,k);int n_buf=n(前缀+k);如果(n_buf==n){a.回推(k);中断;/*找到了*/}如果(n_buf<n_min){n_min=n_buf;/*k_min=k;*/}}}	}	}

帕里

结账A307511型用于最新版本。