注册 登录
编程论坛 数据结构与算法

有一个算法看不懂求解释。

风雨123 发布于 2013-11-05 19:07, 538 次点击
数学太差了,求解释。


康托展开的逆运算
#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;
}
红色部分求解释。
3 回复
#2
b土木丁口2013-11-06 11:10
看不懂
#3
yuccn2013-11-07 10:51
以下是引用b土木丁口在2013-11-6 11:10:15的发言:

看不懂
#4
qunxingw2013-11-07 12:15
专业性太强,问数学老师可能更好
1