有一个算法看不懂求解释。
数学太差了,求解释。康托展开的逆运算
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <cmath>
#include <map>
#define MAXN 1111111
#define MAXM 400005
#define INF 2000000007
#define PI acos(-1.0)
using namespace std;
int n;
long long m;
long long fac[22];
int num[22];
int used[22];
int ans[22];
int main()
{
fac[0] = 1;
fac[1] = 1;
for(int i = 2; i <= 20; i++)
fac[i] = fac[i - 1] * (long long)i;
scanf("%d%I64d", &n, &m);
m--;
for(int i = 1; i <= n; i++) num[i] = i - 1;
for(int i = 1; i <= n; i++)
{
long long k = m / fac[n - i];
for(int j = 1; j <= n; j++)
if(!used[j] && num[j] == k)
{
ans[i] = j;
used[j] = 1;
break;
}
for(int j = 1; j <= n; j++)
if(!used[j] && j > ans[i])
num[j]--;
m = m % fac[n - i];
}
for(int i = 1; i < n; i++) printf("%d ", ans[i]);
printf("%d\n", ans[n]);
return 0;
}
红色部分求解释。