Subset sequence

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 8188 Accepted Submission(s): 3735

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

题意

对于一个序列An={1,2,3...n}A_n=\{1,2,3...n\}An​={1,2,3...n},A1={1},A3={1,2,3}A_1=\{1\},A_3=\{1,2,3\}A1​={1},A3​={1,2,3},我们称一个非空子集元素的排列为一个子集序列。对所有的子集序列按字典顺序排序。求出第m个子序列

思路

首先要求出AnA_nAn​有多少子集:

n=1n=1n=1时,子集个数为1个

n=2n=2n=2时,子集个数为4个

n=3n=3n=3时,子集个数为15个

子集的个数满足F(n)=(F(n−1)+1)×nF(n)=(F(n-1)+1)\times nF(n)=(F(n−1)+1)×n

以n=3n=3n=3为例,将AnA_nAn​全部列出来可得:

{1},{1,2},{1,2,3},{1,3},{1,3,2}\{1\},\{1,2\},\{1,2,3\},\{1,3\},\{1,3,2\}{1},{1,2},{1,2,3},{1,3},{1,3,2}

{2},{2,1},{2,1,3},{2,3},{2,3,1}\{2\},\{2,1\},\{2,1,3\},\{2,3\},\{2,3,1\}{2},{2,1},{2,1,3},{2,3},{2,3,1}

{3},{3,1},{3,1,2},{3,2},{3,2,1}\{3\},\{3,1\},\{3,1,2\},\{3,2\},\{3,2,1\}{3},{3,1},{3,1,2},{3,2},{3,2,1}

例如:

在计算样例3 10时,先计算第10个子集位于第几行(以哪个数字开头)。输出该数字后,把该数字从AnA_nAn​中删除,然后删掉第二行之前的所有子集,和第二行的第一个子集{2}\{2\}{2},mmm变成在剩余集合中的子集的位置。重复操作,至到mmm小于0为止

AC代码

/*
* @Author: WZY
* @School: HPU
* @Date: 2018-11-11 15:02:40
* @Last Modified by: WZY
* @Last Modified time: 2018-11-11 16:06:05
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <time.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
#define bug cout<<"---------"<<endl
#define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"\n"
const double E=exp(1);
const ll maxn=1e6+10;
const int mod=1e9+7;
using namespace std;
// F[n]=(F[n-1]+1)*n
// 计算n对应的子集的个数
ll F(ll n)
{
if(n<=1)
return n;
return (F(n-1)+1)*n;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
double _begin_time = clock();
#endif
ll n,m;
ll a[30];
while(cin>>n>>m)
{
for(int i=1;i<30;i++)
a[i]=i;
int flag=0;
while(m>0)
{
ll k=F(n-1)+1; //记录每行有多少个集合
int res=m/k+1; //记录在第几行
if(m%k==0) //在上一行
res--;
if(flag)
cout<<" ";
cout<<a[res];
for(int i=res;i<=n;i++)
a[i]=a[i+1];
m-=k*(res-1)+1;
n--;
flag++;
}
cout<<endl;
}
#ifndef ONLINE_JUDGE
double _end_time = clock();
printf("time = %lf ms.", _end_time - _begin_time);
#endif
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 (找规律)

    题目链接 Problem Description Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. ...

  3. 题解报告:hdu 2062 Subset sequence

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

  4. HDU 2062 Subset sequence

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

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

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

  6. 【HDOJ】2062 Subset sequence

    这道题目非常好,饶了点儿圈子.我的思路是,先按照组排列.例如,1            2           31 2         2 1        3 11 2 3      2 1 3  ...

  7. HDU 5860 Death Sequence(死亡序列)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  8. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  9. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. error: 'Can't connect to local MySQL server through socket '/data/3307/data/mysql.sock' (2)'

    centos7.5 重启mysql报错 问题: [root@db01-51 ~]# mysqladmin -uroot -p123 -S /data/3307/data/mysql.sock shut ...

  2. docker入门篇 部署springboot项目

    安装docker Ubuntu16.04安装Docker 使用docker 注册docker服务 systemctl enable docker systemctl status docker 然后在 ...

  3. 20175312 2018-2019-2 《Java程序设计》第2周学习总结

    20175312 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 已依照蓝墨云班课的要求完成了第二.三章的学习,主要的学习渠道是视频,和书的课后习题. 总结如 ...

  4. 比原链Bytom错误码一览

    0XX API错误 BTM000", "Bytom API Error" 非比原标准错误 BTM001", "Request timed out&qu ...

  5. 函数func_get_args详解

    func_get_args ------获取一个函数的所有参数 function foo() { $numargs = func_num_args(); //参数数量 echo "参数个数是 ...

  6. _reincarnation

    可以设定转生等级和转生需求.来奖励转生 `level`转生等级 `reqId` 转生需求 `rewId` 转生奖励 `gossipText` 菜单显示

  7. DAY15 模块

    一.模块 1.1 模块的定义:模块就是一系列功能的集合体 1.2 模块的四种存在方式: 1.使用python编写的.py文件(任一py文件都可以作为模块) 2.包:一堆py文件的集合体 3.使用C编写 ...

  8. [C#]中获取当前程序运行路径的方法

    获取当前程序运行路径: ①//获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集.string str = System.AppDomain.CurrentDoma ...

  9. 『OpenCV3』基于色彩分割图片

    一.遍历图像实现色彩掩码 本节我们实现这样一个算法,我们指定某种颜色和一个阈值,根据输入图片生成一张掩码,标记符合的像素(和指定颜色的差异在阈值容忍内). 源代码如下,我们使用一个class完成这个目 ...

  10. Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载

    效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...