题目:求子集序列
Consider the aggregate An= { 1, 2, …, n }. For example, A1={1}, A3={1,2,3}. A subset sequence is defined as a array of a non-empty subset. Sort all the subset sequece of An in lexicography order. Your task is to find the m-th one.

Input:
The input contains several test cases. Each test case consists of two numbers n and m ( 0< n<= 20, 0< m<= the total number of the subset sequence of An ).

Output:
For each test case, you should output the m-th subset sequence of An in one line.

Sample Input
1 1
2 1
2 2
2 3
2 4
3 10

Sample Output
1
1
1 2
2
2 1
2 3 1

本题要求是求出按字典序排列的第m个元素。我们可以先列前几个字典序观察一下:

可以观察到:
1.因为每个数字开头的情况数一样多,所以所有的情况数等于C(n,1)*A(1,1) + C(n,2)*A(2,2) + C(n,3)*A(3,3) … (直到括号中后面的数字等于n)。
2.每一个数字开头的小组中,如果去掉第一个数字,那么剩下的相当于n-1的数形成的一个组,如下图123的排列如果去掉1则相当于23的排列。可以总结为 (g(n)-1) / (n-1) = g(n-1).

那么解这个题,我们可以将问题转化为找到第m个组合在什么位置。再找出这个位置对应的组合。
找位置的话我们要从找到第一个组开始,我们可以根据上面观察到的第一条求出总的情况sum,g=sum/n即为每一组的组合数,再用m/g可以求出在哪一组,然后我们继续找在哪一个小组里面。首先需要将m减去前面的个数以及该小组的第一个数,再找在哪个小组里,任何输出找到的数。直到m=0。
在该题中有一个小技巧,就是可以将1-20存在一个数组中,第几组就对应第几个数,在输出那个数后,那个数之后的数都要加一,以保证字典序不被破坏。

具体代码如下:

#include<iostream>using namespace std;
#define LL long long intint main()
{int n, a[21],c;LL m,t;LL p[21] = {0,1};for(int i = 2; i < 21; i++)p[i] = p[i-1] * (i-1) + 1; while(cin >> n >> m){for(int i = 0 ; i <= 21 ;i++)a[i] = i;while(m != 0 && n >= 0){c = m/p[n] + (m%p[n]?1:0);cout << a[c];for(int i = c; i  < n; i++)a[i] = a[i+1];m -= ((c-1)*p[n] + 1);n--;if(m == 0)cout << endl;elsecout << " ";}}return 0;
}

HDOJ-2062 :Subset sequence(DP)相关推荐

  1. 【XSY2564】sequence(dp)

    题面 [题目描述] 给定一个长度为nnn的由['0'...'9'][\text{'}0\text{'}...\text{'}9\text{'}]['0'...'9']组成的字符串sss,v[i,j]v ...

  2. HDU 6078 Wavel Sequence (dp)

    Description Have you ever seen the wave? It's a wonderful view of nature. Little Q is attracted to s ...

  3. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...

  4. HDU 6170 2017 多校训练:Two strings(DP)

    题意: 给你两个字符串:第一个字符串只包含小写大写字母 第二个字符串除了字母之外,还有'.'和'*',其中'.'可以当成任意一个字符,'*'表示前面那个字符可以重复若干次 当然也可以重复0次,例如a. ...

  5. python【数据结构与算法】程序设计:划分整数(DP)

    蒜头君特别喜欢数学.今天,蒜头君突发奇想:如果想要把一个正整数 nnn 分解成不多于 kkk 个正整数相加的形式,那么一共有多少种分解的方式呢? 蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙. ...

  6. E:K-periodic Garland(DP)

    思路 每个点我们有两种决策,其值为0或1: 如果点我们放置0的话,我们有其前一位数字是零,或者其前一位数字是一. 如果这个点我们放置1的话,我们有其前面是按照每k个数字都出现一次1的排列,也有可能其前 ...

  7. HDU 6078 Wavel Sequence(dp)

    Description 定义波浪序列:a1 > a2 < a3-,现在给出一个长度为n的序列a和一个长度为m的序列b,求a和b的公共波浪子序列个数 Input 第一行一整数T表示用例组数, ...

  8. 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)

    题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 1 #include <bits/s ...

  9. E:Sleeping Schedule(DP)

    或许更好的阅读体验 Sleeping Schedule 思路 这道题读题就感觉像时DPDPDP,读完题后更加坚定了,这是一道DPDPDP题目. 我们考虑状态转移方程,dp[i][j]dp[i][j]d ...

最新文章

  1. 懂你,从选择内裤开始
  2. BP神经网络与卷积神经网络(CNN)
  3. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
  4. Vue使用axios,设置axios请求格式为form-data
  5. 迷你飞信一出,LibFetion该挂了把
  6. linux attach 指令,以太坊实战-attach命令详解
  7. 【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析
  8. K8S 核心组件 kubelet 与 kube-proxy 分析
  9. a大于10小于15C语言,计算机基础复习模拟试卷
  10. IPv6协议漏洞将威胁核心路由器安全
  11. Codeforces 741D dsu on tree
  12. 到底学机械好还是学计算机好,大学同学一个选择学机械,另一个学计算机,对比5年后收入蒙了...
  13. 纯JS写一个用苹果序列号查询生产信息的小工具
  14. 分享几个免费的人工智能类API接口
  15. golang做php的中间件,Golang 之 中间件
  16. 复旦计算机可以跨专业吗,I直达录取现场I2020,还能跨考计算机吗?
  17. 中国鞋服行业首个AIGC准专业级设计大赛来了!
  18. 手机通过USB 利用电脑网络上网
  19. Tree Audio Branch录音 Sophia Pfister - Bad Decisions
  20. a6400监听_横评 | 索尼A6400、A6500、松下G9、GH5S、富士X-T30和佳能M50

热门文章

  1. 管理多供应商物联网项目的10个关键步骤
  2. 情感分析:基于循环神经网络
  3. 基于Kaggle的图像分类(CIFAR-10)
  4. 2021年大数据Hadoop(十一):HDFS的元数据辅助管理
  5. Python 代理爬取网站数据
  6. 最全面的缓存架构设计
  7. maven项目添加文件夹报错
  8. Cocos2d-x3.0 TestCPP文件夹笔记
  9. oracle字符界面安装,怎么解决oracle在linux 纯字符界面安装有关问题
  10. 【CI3.1】CI框架简单使用方法