| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 538 人关注过本帖
标题:有一个算法看不懂求解释。
取消只看楼主 加入收藏
风雨123
Rank: 2
等 级:论坛游民
帖 子:84
专家分:65
注 册:2013-2-23
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:0 
有一个算法看不懂求解释。
数学太差了,求解释。


康托展开的逆运算
#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;
}
红色部分求解释。
搜索更多相关主题的帖子: include 数学 
2013-11-05 19:07
快速回复:有一个算法看不懂求解释。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025960 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved