回复 19楼 czz5242199
你可以用这组数据来测1
19 12164510040883199
1 3 9 11 5 6 7 8 10 2 19 12 4 17 13 14 15 16 18
看你的程序多久后输出大答案
#include<iostream> using namespace std; long long f[21] = {0,1,2}; long long cantor(int num[], int len) { long long sum = 0; for(int i=0; i<len; ++i) { int tmp = 0; for(int j=i+1; j<len; ++j) if(num[i] > num[j]) tmp++; sum += f[len-i-1]*tmp; } return sum+1; } void uncantor(int num[], long long k, int len) { int flag[30] = {0}; for(int i=len-1; i>0; --i) { long long tmp = k / f[i]; k = k % f[i]; int j; for( j=1; j<=len; ++j) { if(flag[j]) continue; if( tmp == 0) break; tmp--; } num[len-i-1] = j; flag[j] = 1; } for(int i=1; i<=len; ++i) if( !flag[i] ) { num[len-1] = i; break; } } int main() { int k; for(int i=3; i<=20; ++i) f[i] = f[i-1] * i; cout << f[19] << endl; while( cin >> k ) { while( k-- ) { long long n,m; cin >> n >> m; int num[30]; for(int i=0; i<n; ++i) cin >> num[i]; long long cnt = cantor(num, n); if( (cnt + m) % f[n] ) m =(cnt+m) %f[n]; else m =f[n]; uncantor(num, m-1, n); cout << num[0]; for(int i=1; i<n; ++i) cout << " " << num[i]; cout << endl; } } return 0; }