HDU 2062 Subset sequence
我是把它当做一道数学题来做的。
这篇题解写的有点啰嗦,但是是我最原始的思维过程。
对于一个集合An= { 1, 2, …, n },在n比较小的情况下,在纸上按字典顺序把所有子集排列一下。
以n=3,m=10举例:
n=3的情况
容易看出前5个打头的是1,紧接着5个子集打头的是2,最后5个开头的是3。
拿前五个来说,除了第一个,后面四个不看开头的1,后面的排列形式和n=2的子集的排列很相似。
f(n)代表集合An所有子集的个数,那么有递推关系:
f(n) = n * (f(n - 1) + 1), f(1) = 1
这里数组taken的作用就是标记某个数是否被占用。
在这个例子里面,要求第一个数,计算(10 - 1) / 5 + 1 = 2。
表示这个数是所有未被占用的数里面从小到大第2个数,也就是2。
再计算一下余数r = (10 - 1) % 5等于4
如果r == 0说明后面的数没有了,跳出循环。
否则m = r;
继续下一轮循环
这里m == 4,计算第二个数 (4 - 1) / 2 + 1 == 2。
现在2已经被第一个数占用了,所以未被占用的第二个数就是3。
后面依次类推。
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int main(void)
{
#ifdef LOCAL
freopen("2062in.txt", "r", stdin);
#endif int n;
bool taken[];
int b[];
long long m, a[];
a[] = ;
for(int i = ; i <= ; ++i)
a[i] = i * (a[i - ] + ); while(scanf("%d%I64d", &n, &m) == )
{
memset(taken, false, sizeof(taken));
int i;
long long r = ;
for(i = ; i <= n; ++i)
{
b[i] = ((m - ) / (a[n - i] + )) + ;
int j, k = ;
for(j = ; j <= n; ++j)
{
if(!taken[j])
++k;
if(k == b[i])
break;
}
b[i] = j;
taken[j] = true;
r = (m - ) % (a[n - i] + );
if(r == )
break;
m = r;
}
for(int j = ; j < i; ++j)
printf("%d ", b[j]);
printf("%d\n", b[i]);
}
return ;
}
代码君
HDU 2062 Subset sequence的更多相关文章
- HDU 2062 Subset sequence 数位dp,思路 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=2062 Subset sequence Time Limit: 1000/1000 MS (Java/Others ...
- HDU 2062 Subset sequence (找规律)
题目链接 Problem Description Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. ...
- 题解报告:hdu 2062 Subset sequence
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2062 Problem Description 考虑集合An = {1,2,...,n}. 例如,A1 ...
- hdu(2062)-Subset sequence 组合数学
意甲冠军:查找集合{1,2,3...n}第一m一个排列子. 收集的线索所行的大小. 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1}: 解法:一个一个元素来确定,每次把剩余 ...
- 【HDOJ】2062 Subset sequence
这道题目非常好,饶了点儿圈子.我的思路是,先按照组排列.例如,1 2 31 2 2 1 3 11 2 3 2 1 3 ...
- HDU 2062:Subset sequence(思维)
Subset sequence Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
随机推荐
- ECMAScript5下Array的方法
声明:ECMAScript不会兼容IE8及以下版本IE浏览器. 一.迭代方法 注:这些迭代方法不会影响数组的值. 每个方法都有两个参数: array.方法(执行函数体,当前作用域(比如this,这个可 ...
- HDU 3642 Get The Treasury (线段树扫描线,求体积并)
参考链接 : http://blog.csdn.net/zxy_snow/article/details/6870127 题意:给你n个立方体,求覆盖三次以上(包括三次)的区域的体积 思路:先将z坐标 ...
- ios滤镜
现在很多滤镜效果都写好了,搬运工的我直接拿来用(感谢
- POJ 2014
#include <iostream> using namespace std; int main() { //freopen("acm.acm","r&qu ...
- DF学Mysql(三)——索引操作
概要: 数据库对象索引其实与书的目录非常相似,主要是为了提高从表中检索数据的速度. 由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据 ...
- java基础知识回顾之抽象类
/* 抽象类: 抽象:笼统,模糊,看不懂!不具体. 特点: 1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中.该类必须也被abstract修饰. ...
- MyEclipse编码设置
(1)windows---->Preferences (2)general---->Workspace (3)设置编码
- BZOJ 1218: [HNOI2003]激光炸弹 前缀DP
1218: [HNOI2003]激光炸弹 Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值 ...
- dom对象详解--document对象(二)
dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...
- 2016CVTE编程题:兔子藏洞
兔子藏洞 题目描述 一只兔子藏身于20个圆形排列的洞中(洞从1开始编号),一只狼从x号洞开始找,下次隔一个洞找(及在x+2号洞找),在下次个两个洞找(及在x+5号洞找),以此类推...它找了n次仍然没 ...