题意:
给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; }
时间: 2024-10-10 02:20:01