首页 > 代码库 > hdu 1027 Ignatius and the Princess II(正、逆康托)

hdu 1027 Ignatius and the Princess II(正、逆康托)

题意:

给N和M。

输出1,2,...,N的第M大全排列。

 

思路:

将M逆康托,求出a1,a2,...aN。

看代码。

 

代码:

int const MAXM=10000;int fac[15];int ans[1005];int kk;int n,m;vector<int> pq;int main(){    int cn=0;    fac[0]=1;    while(1){        ++cn;        fac[cn]=fac[cn-1]*cn;        if(fac[cn]>MAXM){            --cn;            break;        }    }    while(cin>>n>>m){        pq.clear();        rep(i,1,n) pq.push_back(i);        int a;        kk=0;        --m;        rep2(i,n-1,0){            if(i>cn){                a=0;                ans[++kk]=pq.at(a);                pq.erase(pq.begin()+a,pq.begin()+a+1);            }else{                a=m/fac[i];                m%=fac[i];                ans[++kk]=pq.at(a);                pq.erase(pq.begin()+a,pq.begin()+a+1);            }        }        printf("%d",ans[1]);        rep(i,2,kk) printf(" %d",ans[i]); cout<<endl;    }    return 0;}

 

hdu 1027 Ignatius and the Princess II(正、逆康托)