HDU 1027 Ignatius and the Princess II(逆康托展开)

来源:互联网 发布:神奇的印度人 知乎 编辑:程序博客网 时间:2024/06/03 17:28

题意:给你一个n,让你求n的全排列中第m小的序列。(n, m <= 1e5)


思路:逆康托展开 (知识见:点击打开链接)


代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int maxn = 10;int fac[maxn] = {1, 1};bool vis[100005];void init(){    for(int i = 2 ; i < maxn; i++)        fac[i] = fac[i-1]*i;}int main(void){    init();    int n, m;    while(cin >> n >> m)    {        memset(vis, 0, sizeof(vis));        m--;        int temp = 1;        while(temp < n)        {            if((n-temp) <= 8)            {                int k = m/fac[n-temp];                m = m%fac[n-temp];                int cnt = 0;                for(int i = 1; i <= n; i++)                {                    if(!vis[i]) cnt++;                    if((cnt-1) == k)                    {                        printf("%d ", i);                        vis[i] = 1; break;                    }                }            }            else            {                for(int i = 1; i <= n; i++)                {                    if(!vis[i])                    {                        vis[i] = 1;                        printf("%d ", i); break;                    }                }            }            ++temp;        }        for(int i=1; i<=n; i++)            if(!vis[i]) printf("%d\n", i);    }    return 0;}


原创粉丝点击