hdu(2062)-Subset sequence 组合数学

系统 1801 0

意甲冠军:查找集合{1,2,3...n}第一m一个 排列子。

收集的线索所行的大小。

          例两个元素的排列子集合按字典树排列是:{1}, {1,2}, {2}, {2,1};


解法:一个一个元素来确定,每次把剩余的元素按大小顺序排列在num中,然后依据排列组合原理直接计算下一个位置的元素的大小。直到排列数为0停止;


代码:

      /******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
const double pi=acos(-1.0);
typedef long long LL;
const int Max=21;
const int INF=1000000007;
LL A[Max][Max];
LL sum[Max];
void init()
{
    for(int i=0; i<Max; i++)
        for(int j=0; j<=i; j++)
            A[i][j]=j?A[i-1][j-1]*j+A[i-1][j]:1;
    for(int i=0; i<Max; i++)
        for(int j=0; j<=i; j++)
            sum[i]+=A[i][j];
}

int n;
LL m;
int num[Max];
int main()
{
    init();
    while(scanf("%d%I64d",&n,&m)==2)
    {
        for(int i=1; i<=n; i++)
            num[i]=i;
        int len=n;
        int t=(m-1)/sum[len-1]+1;
        printf("%d",num[t]);
        m-=(t-1)*sum[len-1]+1;
        for(int k=t; k<=len-1; k++)
            num[k]=num[k+1];
        len--;
        while(m)
        {
            int t=(m-1)/sum[len-1]+1;
            printf(" %d",num[t]);
            m-=(t-1)*sum[len-1]+1;
            for(int k=t; k<=len-1; k++)
                num[k]=num[k+1];
            len--;
        }
        puts("");
    }
    return 0;
}

    

版权声明:本文博客原创文章,博客,未经同意,不得转载。

hdu(2062)-Subset sequence 组合数学


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论