/*******打出1-n的阶乘表*******/ int f[20]; voidjie_cheng(int n) { f[0] = f[1] = 1; // 0的阶乘为1 for(int i = 2; i <= n; i++) f[i] = f[i - 1] * i; } /**************康托展开****************/ string str; intkangtuo() { int ans = 1; //注意,因为 12345 是算作0开始计算的,最后结果要把12345看作是第一个 int len = str.length(); for(int i = 0; i < len; i++){ int tmp = 0;//用来计数的 for(int j = i + 1; j < len; j++){ if(str[i] > str[j]) tmp++; //计算str[i]是第几大的数,或者说计算有几个比他小的数 } ans += tmp * f[len - i - 1]; } return ans; }
/**************康托逆展开**************/ vector<char> vec; //存需要排列的字符 voidrev_kangtuo(int k)//输出序号为 k 的字符序列 { int n = vec.size(), len = 0; string ans = ""; k--; // 算的时候是按 12345 是第0位 for(int i = 1; i <= n; i++){ int t = k / f[n - i]; // 第 i 位需要 第 t + 1 大的数 k %= f[n - i]; //剩下的几位需要提供的排列数 ans += vec[t] ; // vec[t] 就是第 t + 1 大的数 vec.erase(vec.begin() + t); //用过就删了,不用vector用暴力也可以,就是说枚举,然后一个一个的比较大小,并记录有几个没用过的字符且字典序比它小 } cout << ans << '\n'; }