题目链接

Problem Description

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

分析:

给定1,2,3...N个数的集合,现在求所有非空子集(相同元素不同位置视为不同)按字典序排序后的第m个集合是什么?

我们用f[i]来表示i个元素的子序列的个数,可以找出地推的规律:f[n] = n * (f[n-1] + 1);

思路:求n个元素时序列首元素,序列变为n-1,

求n-1个元素时序列首元素......

用t = ceil(m/(f[n-1]+1)),即可求得所求序列在所有序列中是第几组,也就是当前第一个元素在序列数组a中的位置

用数组a表示序列数组[1,2,...,n](需要动态更新,每次求出t之后,都要删除t位置的元素)

在更新之后,序列数组总长度变为n-1,我们要求一下所求序列的新位置m = m - (t-1)*(f[n-1]+1) - 1(前面有t-1组,每组f[n-1]个元素)

代码:

#include<stdio.h>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
long long m, f[25];
f[0] = 0;
for (int i =1; i < 21; i++)
f[i] = i * (f[i - 1] + 1);
while (scanf("%d%lld", &n, &m) != EOF)
{
int flag = 1, a[25];
for (int i = 1; i <= n; i++)
a[i] = i;
while (m > 0)
{
int t = ceil(m * 1.0 / (f[n - 1] + 1));//求出的是n个数字的首元素的位置
if (!flag)
printf(" ");
flag = 0;
printf("%d", a[t]);
for (int i = t; i < n; i++)//然后要删去这个元素
a[i] = a[i + 1];
m = m - (t - 1) * (f[n - 1] + 1) - 1;//去掉一个元素后,总共的个数也要改变
n--;
}
printf("\n");
}
return 0;
}

HDU 2062 Subset sequence (找规律)的更多相关文章

  1. HDU 2062 Subset sequence 数位dp,思路 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=2062 Subset sequence Time Limit: 1000/1000 MS (Java/Others ...

  2. 题解报告:hdu 2062 Subset sequence

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2062 Problem Description 考虑集合An = {1,2,...,n}. 例如,A1 ...

  3. HDU 2062 Subset sequence

    我是把它当做一道数学题来做的. 这篇题解写的有点啰嗦,但是是我最原始的思维过程. 对于一个集合An= { 1, 2, …, n },在n比较小的情况下,在纸上按字典顺序把所有子集排列一下. 以n=3, ...

  4. hdu(2062)-Subset sequence 组合数学

    意甲冠军:查找集合{1,2,3...n}第一m一个排列子. 收集的线索所行的大小. 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1}: 解法:一个一个元素来确定,每次把剩余 ...

  5. HDU1005Number Sequence(找规律)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. HDU 4861 Couple doubi(找规律|费马定理)

    Couple doubi Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  7. hdu 5241 Friends(找规律?)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  8. hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ...

  9. hdu 3951 - Coin Game(找规律)

    这道题是有规律的博弈题目,,, 所以我们只需要找出规律来就ok了 牛人用sg函数暴力找规律,菜鸟手工模拟以求规律...[牢骚] if(m>=2) { if(n<=m) {first第一口就 ...

随机推荐

  1. 三星vs苹果 2018Q3 财报 以及国内最赚钱的公司...

    三星文字版为: 10月31日消息,据国外媒体报道,当地时间周三韩国三星电子公布季度财报,得益于市场对其存储芯片和其他零部件的强劲需求,营业利润创下历史新高.三星不仅在自家设备上使用自己生产的芯片,还向 ...

  2. intel 的架构图

    第一代: 第二代 第三代 以及对比

  3. laravel报404错误与NGINX报404错误区别

      nginx自己配置的404页面 和laravel配置的404页面:如果报了404 :执行laravel的404页面: 那这个404页面对nginx来说意味着什么    laravel 路由和页面找 ...

  4. docker-py安装

    linux: pip install docker-py  

  5. Linux下安装 mongodb

    1.下载 去官网 https://www.mongodb.com  找到对应版本的mongodb 的下载地址 这样的: https://fastdl.mongodb.org/linux/mongodb ...

  6. P4838 P哥破解密码

    题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...

  7. CF702F T-Shirts

    题目描述 The big consignment of t-shirts goes on sale in the shop before the beginning of the spring. In ...

  8. P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1​ ,并把左起第一个物品至 P1P_1P1 ...

  9. BZOJ 1283: 序列

    1283: 序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 272  Solved: 151[Submit][Status][Discuss] D ...

  10. Group Anagrams - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Group Anagrams - LeetCode 注意点 字母都是小写的 解法 解法一:用一个字符串表示strs[i]中出现的字母,比如:abc-> ...