/*克里斯蒂安·弗兰库(Cristian Francu),2019-12-19生成A005228的第N个元素的C源代码。在O(sqrt(N))时间内运行,并使用O(sqrt(N))内存。适用于N至20亿,但可以通过以下两种方法获得更高的值128位整数或大数。描述:-我们线性生成元素,将它们存储在队列中,以便知道何时跳过它们。跳过某个元素时,我们会将其从队列中取出。-在达到队列中的最后一个元素(跳过)。-当我们可以生成至少N个元素时,我们停止线性生成。换句话说,队列中的最后一个元素减去一就更大或等于所需的第N个元素。-这样,我们将生成大约sqrt(N)元素。-此时,队列将包含大约sqrt(N)个元素。-以上所有操作都使用整数计算(四个字节)。-在这一点上,我们使用一个公式来计算第N个元素:它是和指一系列连续的数字。-我们调整总和,减去队列中的元素(除了最后一个)。-最后一步也是sqrt(N)时间,因为这是队列的长度。-最后一步使用长减法(8个字节)。*/#包括#定义MAXQ 65536已使用int[MAXQ];整型main(){int n,i,l,first,last,inqueue,xc,qlen,maxq;长x长;扫描(“%d”,&n);使用的[first=last=0]=-1;//哨兵xc=1;l=1;排队=0;i=n-1;最大值=0;while(i>排队){l++;如果(l==使用[第一个]){第一个=(第一个+1)%MAXQ;l++;}排队+=l-1;used[last]=xc+l;last=(last+1)%MAXQ;if((最后-第一个+MAXQ)%MAXQ>MAXQ)maxq=(最后-第一个+maxq)%maxq;xc+=l;i——;排队--;}//这是第二个阶段,对队列中的元素进行求和和减法。x=xc;如果(i>0){/*从xc开始,我们还有i个元素要计算加l+1 l+2。。。等等。但是,我们需要添加这样的数字加上额外的元素。多少?中的元素数队列减去一(这些是我们要减去的元素)。所以,事实上,我们将添加:l+1 l+2。。。l+qlen-1*/qlen=(last-first+MAXQ)%MAXQ;x+=(2*l+i+qlen)*(long-long)(i+qlen-1)/2;//然后减去队列中除最后一个元素以外的所有元素。while(--qlen){x-=使用[第一个];第一个=(第一个+1)%MAXQ;}}打印f(“%lld\n”,x);返回0;}