康托展开和逆展开
2017-03-30 22:54
246 查看
解析http://www.2cto.com/kf/201311/260148.html
//展开,给你一个排列,让你求这是第几个排列 //逆展开,给你一个数n,让你求第n个排列是什么 #include<iostream> using namespace std; int fac[] = {1,1,2,6,24,120,720,5040,40320}; //i的阶乘为fac[i] int a[5]={1,2,3,4,5}; void f1() { int b[5],i,j,num=0,t; for (i=0; i<5; i++) cin>>b[i]; //求b是第几个排列 for (i=0 ;i<5; i++) { t = 0; for (j=i+1; j<5; j++) { if(b[i]>b[j]) { t++; //t为a[i]在数组中为第几大(从0开始) } } num += t*fac[5-i-1]; } cout<<num+1<<endl; //是num个比b小的排列,而b是第num+1个 } void f2() { int i,j,k,t,v[100]={0},b[5]; cin>>k; //找第k个排列 k--; for (i=0; i<5; i++) { t = k / fac[5-i-1]; for (j=1; j<=5; j++) { if (v[j]==0) { if (t==0) break; t--; } } b[i] = j; v[j] = 1; k = k % fac[5-i-1]; } for (i=0 ;i<5; i++) cout<<b[i]<<" "; } int main() { f1();//展开 f2();//逆展开 return 0; }
相关文章推荐
- 康托展开和逆康托展开 - Ruby
- 康托展开(ny139)和逆康托展开
- nyoj139我排第几个&nyoj第几是谁?——康托展开及康托逆展开
- 康托展开和逆展开
- 康托展开和逆康托展开
- 康托展开与逆康托展开
- 康托展开和逆康托展开
- 康托展开与逆康托展开
- 康托展开&逆康托展开
- 康托展开和康托展开的逆运算
- 康托展开与康托逆展开
- ACM数论之旅12---康托展开((*゚▽゚*)装甲展开,主推进器启动,倒计时3,2,1......)
- 康托展开与康托逆展开,细节决定成败!
- 康托展开和康托逆展开解决第K个排列问题
- 康托展开与康托展开的逆运算
- 康托展开与逆康托展开(bzoj 3301: [USACO2011 Feb] Cow Line)
- 康托逆展开和康托展开的逆运算
- 康托展开和逆康托展开
- 康托展开 & 康托逆展开
- 康托展开和逆康托展开的实现