/*s_A210237.c s_A21028.c版权所有(C)2012年3月Sergei Viznyuk打印OEIS序列A210237 A210238(当k=n时)这个程序以正整数n和k作为输入。对于给定的n值,它打印的是多项式系数M(n)=n/(m1!m2!…mk!)和M(n)的重数D(n)。这里是m1+m2++mk=n是将n划分为<=k个部分。第一行包含标题M、D随后的行包含以逗号分隔的M、D值(按递增顺序)n和M(n),其中M——多项式系数的显著值D-M给定值的多重性M的值按行组成http://oeis.org/A210237顺序。D的值由行组成http://oeis.org/A210238顺序。实现了求给定整数n的分区的算法摘自以下论文:整数分区的恒定时间生成YAMANAKA等人,IEICE Trans Fundamentals.2007;E90-A:888-895使用的示例MATLAB代码:http://www.mathworks.com/matlabcentral/newsreader/view_thread/162379此代码受LLONG_MAX值的限制。如果参数n和k导致M值超过LLONG_MAX时,代码返回溢出错误。代码通过验证总和(M*D)=k^n对计算序列执行校验和这是自由软件;你可以重新发布和/或修改它根据GNU通用公共许可证的条款自由软件基金会;许可证的版本2,或(由您选择)任何更高版本。这个程序的发布是希望它会有用,但是无任何担保;甚至没有适销性或特定用途的适用性。有关更多详细信息,请参阅GNU通用公共许可证。*/#包括#包括#包括#包括#如果定义__CYGWIN__#定义EXP EXP#定义LGAMMA LGAMMA#其他#定义EXP expl#定义LGAMMA lgammal#结尾typedef结构{长-长-无符号M,D;长-无符号k,M[];}wt;静态重量**s;静态长无符号k,k0,cr=0,inc=1000;静态长双dn,en;static long-long unsigned powi(long-long-unsignedb,long-unssignedp){如果(p>1)返回b*powi(b,p-1);如果(!p)返回0;返回b;}静态空隙cmpt(wt*a){长无符号i=0,j=0,k=a->k,*m=a->m;长双d=dn,e=en;而(i1)d-=LGAMMA(1.0L+m[i]);如果(m[i]!=m[j]){如果(i>j+1)e-=LGAMMA(1.0L+i-j);j=i;}i++;}a->M=l圆(EXP(d));如果(i>j+1)e-=LGAMMA(1.0L+i-j);如果(k0>i+1)e-=LGAMMA(1.0L+k0-i);a->D=l圆(EXP(e));}静态int比较(wt**ap,wt**bp){wt*a=*ap,*b=*bp;如果(!a->M)cmpt(a);如果(!b->M)cmpt(b);如果(a->M>b->M)返回1;如果(a->M<b->M)返回-1;返回0;}静态空隙儿童3(重量*a){wt*b;长无符号i=a->k,*m=a->m;如果(cr==inc)s=重新分配(s,(inc+=inc)*大小(wt*));s[cr++]=a;如果(*m>m[1]){如果(i<k){b=malloc(sizeof(wt)+(i+1)*sizeof)(长无符号);memcpy(b,a,sizeof(wt)+i*sizeof,长无符号);(*b->m)--;b->m[i]=1;b->k++;儿童3(b);}如果(m[i-2]>m[i-1]&&(i>2||(m[i2]-m[i-1])>1)){b=malloc(sizeof(wt)+i*sizeof,长无符号);memcpy(b,a,sizeof(wt)+i*sizeof,长无符号);(*b->m)--;b->m[i-1]++;儿童3(b);}}}int main(int argn,char*argc[]){重量*a;长无符号i,n;long-long无符号t,d,m,p=1,q=0;如果(argn!=3){fprintf(stderr,“用法:%s \n“,argc[0]);返回-1;}n=原子醇(argc[1]);k=k0=原子(argc[2]);如果(n<k)k=n;如果(!k)返回0;看跌期权(“M,D”);t=k0;如果(k==1)转到ne;dn=LGAMMA(1.0L+n);en=LGAMMA(1.0L+k0);s=malloc(inc*sizeof(long unsigned*));a=malloc(sizeof(wt)+2*sizeof)(长无符号);a->M=0;a->k=2*a->m=n-1;a->m[1]=1;儿童3(a);如果(cr>1)qsort(s,cr,sizeof(长无符号*),(int(*)(常量无效*,常量无效*))&比较);其他的比较(&a,&a);对于(i=0;iM;d=a->d;如果(p==m)t+=d;否则{q+=p*t;fprintf(标准输出,“%llu,%llu\n”,p,t);p=m;t=d;}免费(a);}空闲;氖:q+=p*t;fprintf(标准输出,“%llu,%llu\n”,p,t);p=功率(k0,n);如果(q==p),则返回0;fprintf(标准错误,“***溢出错误:k^n=%llu\n”“总和(M*D)=%llu\n”,p,q);返回1;}