进制类

void d(int h)
{
if(a[h]>3)
{
a[h]=1;
a[h-1]++;
d(h-1);
}
}

其中3为设置的最高数,不适用>=,会导致结果偏小
且在枚举过程中


for(int i=10;:a[0]==0;)
{
if(cc()==n)copy();
a[i]++;
if(a[i]==4)d[i];
}

用a[0]限制溢出,a[i]++放中间,进位函数放第三位,题目操作放首位。

排列类

因为每位的值最小相差1,所以要考虑从第一个仅进位的项开始重置


int df(int g,int t)
{
if(g>=1)
{
if(b[g]>c[g])
{
b[g-1]++;
t=g;
}
returndf(g-1,t);
}
else return t;
}
int h=df(m,0);
int (h!=0)
{
for(int i=h;i<=m;i++)
{
b[i]=b[i-1]+1;
}
}

返回的t表示发生进位的最大位数,然后在该点后进行重置。

上为进位系统。数组C记录最大的位置,而数组B记录当前的排列。如下:

for(int i=1;i<=n;i++)
{
a[i]=i;
}
c[0]=n-m;
for(int i=1;i<=m;i++)
{
b[i]=i;
c[i]=c[i-1]+1
}

其中数组A记录题目给出范围,使用时a[b[]]即可。

全排列

include<algorithm>

next_permutation(a+,a+n)

除此之外,本人的思路为交换数列的最后两位,满二进一,前位满则替换为最小的空余的数,但是需要搜索算法,于是不会了。