题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2062

题目大意:

给出n和m,集合{1,2,,,,n}的非空子集,按照一定方式排列,例如n==3时,

1
1    2
1    2    3
1    3
1    3    2
2
2    1
2    1    3
2    3
2    3    1
3
3    1
3    1    2
3    2
3    2    1
然后输出第m个序列。
 
思路:
先小规模枚举,n = 1时有1个序列,n=2时有4个序列,n=3时有15个序列。
可推出F[n] = n * (F[n - 1] + 1),F[n]表示n个元素的序列个数。那就可以想到,给定一个m,可以先推出第1位,比如n = 3,m = 6时,第一位肯定是2,那我们可以递推下去,确定第一位,然后m减小,再递推出下一位。
还是之前的例子,n = 3, m = 6, 1开头的有5个,2开头的有5个,这样可以用7除以5向上取整,求出目前是第几位,所以得出以下解法:
 
首先设c = (m + F[n - 1] ) / (F[n - 1] + 1)(这是m除以F[n - 1] + 1 向上取整),c就表示当前这一位是第c小的。
然后m = m - (c - 1) * (F[n - 1] + 1),n--,这样就可以循环下去,求目前的n和m中的第一位是什么,这里要注意的是m还得自减一,还是用上面的例子说明,求出第一位为2后,m = 1, n = 2;我们知道m = 1, n = 2按照上面的公式算出来c = 1,也就是在1,3之中第一小的数字,就是1,序列是2,1,这与答案有误,答案应该就是2,错误的原因在于这个序列的构造,n = 2时只有4种,而我们的m算出来最大可以为5(就是n=3,m = 10的时候,循环之后n = 2, m = 5),所以m应该自减一,这样正好可以对应上,如果自减一之后等于0,就应该退出循环,结束构造,这样就可以得到之前的正确答案“2”。在每次求出一位之后,数组应该左移一位,这样可以直接利用移动后的数组来求当前第c小的数字
 
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
int cases;
const int maxn = 1e5 + ;
typedef long long ll;
ll n, m, a[];
void init()
{
a[] = ;
for(ll i = ; i < ; i++)a[i] = i * (a[i - ] + );
//for(int i = 1; i <= 20; i++)cout<<a[i]<<endl;
}
int main()
{
init();
while(cin >> n >> m)
{
int b[], ans[], tot = ;
for(int i = ; i <= n; i++)b[i] = i;
while(m > )
{
int c = (m + a[n - ]) / (a[n - ] + );
//cout<<m << " "<<c<<" "<< n<<endl;
ans[tot++] = b[c];
n--;
for(int i = c; i <= n; i++)b[i] = b[i + ];
m -= (c - ) * (a[n] + );
m--;
if(m <= )break; }
cout<<ans[];
for(int i = ; i < tot; i++)cout<<" "<<ans[i];
cout<<endl;
}
}
 

hdu2062 Subset sequence----递推的更多相关文章

  1. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

  2. hdu-5496 Beauty of Sequence(递推)

    题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  3. HDU 5950 Recursive sequence 递推转矩阵

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  4. hdu 5860 Death Sequence(递推+脑洞)

    Problem Description You may heard of the Joseph Problem, the story comes from a Jewish historian liv ...

  5. hdu 5950 Recursive sequence 递推式 矩阵快速幂

    题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...

  6. bzoj 2656 [Zjoi2012]数列(sequence) 递推+高精度

    2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Descri ...

  7. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)

    题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...

  9. POJ_1019 Number Sequence 【递推】

    题目: A single positive integer i is given. Write a program to find the digit located in the position ...

  10. POJ_2478 Farey Sequence 【欧拉函数+简单递推】

    一.题目 The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbe ...

随机推荐

  1. 【node】安装和配置node项目文件

    需要把 views文件中的子文件全部改为以 .ejs的后缀 1·npm install express -g (全局安装) 2·npm install -g express-generator (安装 ...

  2. TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。

    整体思路: 创建本地新分支 (create branch)  -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit)  -- 推送到远程新分支 (push)  ...

  3. CSS(CSS3)选择器(1)

    这篇文章主要用于存储CSS以及CSS3的选择器部分知识,以便日后查阅及记忆. 该内容分为两部分,第一部分为css选择器的一些基本知识.第二部分为CSS3新增加的选择器. 在开始之前,先简单介绍一下选择 ...

  4. KVM之一:安装准备(基于CentOS6.7)

    KVM 虚拟机简介: Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自 ...

  5. Android Intent 基本使用及对象构成

    Intent基本使用 Intent可以理解为不同组件通信的媒介或者信使. Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast. 具体方法如下表 ...

  6. [Scala] 了解 协变 与 逆变

    首先定义一个类 A,其参数类型 T 为协变,类中包含一个方法 func,该方法有一个类型为 T 的参数: class A[+T] { def func(x: T) {} } 此时在 x 处会有异常提示 ...

  7. Struts2——第一个helloworld页面

    struts2是一个较为成熟的mvc框架,先看看怎么配置struts2并且产生helloworld页面. 首先从官网下载struts2,http://struts.apache.org/downloa ...

  8. C语言第一次博客作业---顺序机构基础练习

    一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...

  9. 【iOS】swift-文字宽度的计算

    如图所示,需要sectionView的标题宽度可以动态变化 举例说明: 只需在tableView的代理方法 func tableView(tableView: UITableView, viewFor ...

  10. java的socket通信

    本文讲解如何用java实现网络通信,是一个非常简单的例子,我比较喜欢能够立马看到结果,所以先上代码再讲解具体细节. 服务端: import java.io.BufferedReader; import ...