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 ...
随机推荐
- JS读取client端的文件的代码片段
JS读取client端的文件内容的代码片段 if(window.FileReader){ var html5file = this.pipeDetailFileUpLoader._files[0]; ...
- 用 VIPER 构建 iOS 应用架构(1)
[编者按]本篇文章由 Jeff Gilbert 和 Conrad Stoll 共同编写,通过构建一个基础示例应用,深入了解 VIPER,并从视图.交互器等多个部件理清 VIPER 的整体布局及思路.通 ...
- LSTM/RNN的应用Case
作者:许铁-巡洋舰科技链接:https://www.zhihu.com/question/37082800/answer/126430702来源:知乎著作权归作者所有,转载请联系作者获得授权. 作者: ...
- CSS 的overflow:hidden 属性详细解释
overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出, 而对于清除浮动这个含义不是很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...
- Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能
一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...
- 282. Expression Add Operators
题目: Given a string that contains only digits 0-9 and a target value, return all possibilities to add ...
- 机器学习 —— 概率图模型(Homework: CRF Learning)
概率图模型的作业越往后变得越来越有趣了.当然,难度也是指数级别的上涨啊,以至于我用了两个周末才完成秋名山神秘车牌的寻找,啊不,CRF模型的训练. 条件随机场是一种强大的PGM,其可以对各种特征进行建模 ...
- SpringBoot配置属性之Server
SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...
- 格子布局 js
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- HDU 4634 Swipe Bo 状态压缩+BFS最短路
将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...