/*s_A078760.c s_A209936.c s_A080577.c版权所有(C)2012年3月Sergei Viznyuk打印OEIS序列A078760 A209936 A080577这个程序以正整数n和k作为输入。对于给定的n值,它将n的所有分区打印成<=k部分。第一行包含标题M、D\k和有序值1,2、..、,。。,k个随后的行包含以逗号分隔的值M、D、m1、m2、..、,。。,百万,其中M-多项式系数的值M=n/(m1!m2!…mk!)其中m1+m2++mk=n是n到<=k部分的给定分区D-给定m1、m2、..的重数,。。,mk分区,即编号方式m1,m2,。。,mk值可以在k个箱子之间分布m1—第一分区的总体m2——第二分区人口* - ..* - ..mk-第k分区的总体M的值按行组成http://oeis.org/A078760顺序。D的值由行组成http://oeis.org/A209936顺序。值m1、m2、…、,。。,mk(省略后面的零值)按行组成A080577输入参数k=n时的序列。实现了求给定整数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结构{long long unsigned M,D;long unssigned 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;长无符号*c1=a->m,*c2=b->m;长无符号i=0,k=a->k;如果(!a->M)cmpt(a);如果(!b->M)cmpt(b);而(i<k)如果(c1[i]<c2[i]),则返回1;否则,如果(c1[i]>c2[i])返回-1;其他i++;返回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,j,n,h,*m;长长无符号p,q;如果(argn!=3){fprintf(stderr,“用法:%s \n“,argc[0]);返回-1;}n=原子醇(argc[1]);k=k0=原子(argc[2]);如果(n<k)k=n;如果(!k)返回0;fprintf(标准输出,“M,D\\k”);i=0;而(iM=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;i米;h=a->k;j=0;fprintf(标准输出,“%llu,%llu”,a->M,a->D);q+=a->M*a->D;对于(j=0;j-->