康托展开与全排列

来源:互联网 发布:mac cocos 环境搭建 编辑:程序博客网 时间:2024/05/29 02:10

转自https://www.cnblogs.com/stepping/p/7349082.html

康托展开:已知一个排列,求这个排列在全排列中是第几个
康托展开逆运算:已知在全排列中排第几,求这个排列

其中f[] = { 1,1,2,6,24,120,720,5040,40320,362880 };

//康托展开  LL Work(char str[])  {      int len = strlen(str);      LL ans = 0;      for(int i=0; i<len; i++)      {          int tmp = 0;          for(int j=i+1; j<len; j++)              if(str[j] < str[i]) tmp++;          ans += tmp * f[len-i-1];  //f[]为阶乘      }      return ans;  //返回该字符串是全排列中第几大,从1开始  }
//康托展开逆运算  辗转相除法void Work(LL n,LL m)  {      n--;  //因为a中元素下标是从0开始,所以第n个应该是编号n-1    vector<int> v;      vector<int> a;      for(int i=1;i<=m;i++)          v.push_back(i);      for(int i=m;i>=1;i--)      {          LL r = n % f[i-1];          LL t = n / f[i-1];          n = r;          sort(v.begin(),v.end());          a.push_back(v[t]);          v.erase(v.begin()+t);      }      vector<int>::iterator it;      for(it = a.begin();it != a.end();it++)          cout<<*it;      cout<<endl;  }


原创粉丝点击