void permutation(int a[],int n,int k)
- 获得\(S_n\)中按字典序排号为k的置换,并存储在a[]中
- 最大支持n=13
/*
备注:
未测试
2018/09/02
*/
void permutation(int a[],int n,int k)
{
int fac[13]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};
int mark[13];memset(mark,0,sizeof mark);
for(int i=1;i<=n;++i)
{
int tmp=(k-1)/fac[n-i]+1;k-=(tmp-1)*fac[n-i];
debug(tmp);
int j,cnt;
for(j=1,cnt=0;cnt!=tmp;j++)if(mark[j]==0)cnt++;
mark[--j]=1;a[i]=j;
}
}