康拓展开及其逆展开
#include<bits/stdc++.h> using namespace std; const int maxn = 100000000+100; int n, m, cnt; int f[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880}; int fun(int *a, int n) { int s = 0; for(int i=0; i<n; i++){ int c = 0; for(int j=i+1; j<n; j++){ if(a[j] < a[i]) c++; } s += f[n-i-1] * c; } return s; } int main() { int a[150]; cin >> n; for(int i=0; i<n; i++){ cin >> a[i]; } cout << fun(a,n); return 0; } /* 5 3 4 1 5 2 61 */
#include<iostream> #include<cstring> #include<vector> #include<algorithm> using namespace std; int f[]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880}; char s[150]; int n,x,v[150],a[150]; void fun() { int k; for(int i=1; i<=n; i++) v[i]=1; for(int i=1; i<=n; i++){ k = x / f[n-i]; x %= f[n-i]; for(int j=1; j<=n; j++){ if(!v[j]) continue; if(!k) {v[j]=0; a[i]=j; break;} k--; } } for(int i=1; i<=n; i++) cout<<a[i]; } int main() { cin >> n >> x; fun(); return 0; }