回复 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;
}