#如果!定义的HAVE_PARTITION_H__#定义HAVE_PARTITION_H__//此文件是FXT库的一部分。//版权所有(C)2010、2012、2014、2019 Joerg Arndt//许可证:GNU通用公共许可证版本3或更高版本,//请参阅主目录中的文件COPYING.txt。#包括“fxttypes.h”不同等级客舱间隔板//整数分区。//顺序是这样的,共轭体是阿布拉莫维茨/斯特根顺序。//表示为零件多样性的数组。//参考OEIS序列A000041。{公众:ulong*c;//分区:c[1]*1+c[2]*2+…+c[n]*n==nulong*s_;//累计和:s[j+1]=c[1]*1+c[2]*2+…+抄送[j]*julong n;//n的分区partition(const partition&)=删除;partition&operator=(const partition&)=删除;公众:显式分区(ulong n){n_=n;c=新ulong[n+1];s=新ulong[n+1];s_[0]=0;//未使用的c[0]=0;//未使用的first();}~分区(){删除[]c;删除[]s;}void first(){c[1]=n;对于(ulong i=2;i<=n;i++){c[i]=0;}如果(n_==0)c_[0]=1;//为n==0工作s_[1]=0;对于(ulong i=2;i<=n;i++){s[i]=n;}}无效last(){对于(ulong i=1;i=2可增加:ulong i=2;while(s[i]1 ){s[i]=z;c[i]=0;}c[1]=z;//z*1==z//s_[1]未使用返回true;}bool prev(){如果(c[1]==n)返回false;//第一个==n*1(c[1]==n)//找到第一个非零系数c[i],其中i>=2:ulong i=2;而(c[i]==0)++i;--c[i];s_[i]+=i;ulong z=s[i];//现在设置c[1],c[2]。。。,c[i-1]到最后一个分区//z的i-1部分:而(--i>1){//ulong q=z/i;ulong q=(z>=i?z/i:0);//==z/i;(优化)c[i]=q;s_[i+1]=z;z-=q*i;}c[1]=z;s[2]=z;//s_[1]未使用返回true;}ulong num_parts()常量//返回部件数(长度)。//示例:分区// 6 == 4* 1 + 1* 2 + 0 + 0 + 0 + 0 == 1 + 1 + 1 + 1 + 2//有5个部分(4个1和1个2)。{ulong ct=0;对于(ulong k=1;k<=n;++k)ct+=c[k];返回ct;}ulong num_sorts()常量//返回不同部件的编号。//示例:分区// 6 == 4* 1 + 1* 2 + 0 + 0 + 0 + 0 == 1 + 1 + 1 + 1 + 2//有两种排序(1和2)。//同:共轭分区的排序数。{ulong ct=0;对于(ulong k=1;k<=n;++k)ct+=(c[k]!=0);返回ct;}bool is_dist_parts()常量//返回分区是否划分为不同的部分//(即,是否不重复任何部分)。//与:num_sorts()==num_parts()相同{对于(ulong k=1;k<=n;++k)如果(c[k]>1)返回false;返回true;}布尔is_into_add_parts()常量//返回分区是否为奇数部分(仅)。{对于(ulong k=2;k<=n;k+=2)如果(c_[k]!=0)返回false;返回true;}布尔is_into_even_parts()常量//返回分区是否为偶数部分(仅)。{对于(ulong k=1;k<=n;k+=2)如果(c[k]!=0)返回false;返回true;}ulong largest_part()常量//返回最大部分。//示例:分区// 6 == 4* 1 + 1* 2 + 0 + 0 + 0 + 0 == 1 + 1 + 1 + 1 + 2//有最大的部分2。{ulong m=0;对于(ulong j=1;j<=n;++j)如果(c_[j]!=0)m=j;返回m;}ulong smallest_part()常量//返回最小的部分。//示例:分区// 6 == 4* 1 + 1* 2 + 0 + 0 + 0 + 0 == 1 + 1 + 1 + 1 + 2//具有最小的部分1。{对于(ulong j=1;j<=n;++j)如果(c[j]!=0),则返回j;返回0;}long-rank()常量//返回戴森的军衔。{return(long)(largest_part()-num_parts());//jjcast公司}ulong num of(ulong m)常数//零件退回数量m。//示例:分区// 6 == 4* 1 + 1* 2 + 0 + 0 + 0 + 0 == 1 + 1 + 1 + 1 + 2//对于m>=3,具有num_of(1)=4、num_off(2)=1和num_of(m)=0。{返回c[m];}bool OK()常量{ulong z=0;对于(ulong k=1;k<=n;++k)z+=k*c[k];如果(z!=n)返回false;对于(ulong k=0;k-->