题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2062
Subset sequence
题目大意:考虑一个集合 An = { 1, 2, ..., n}。比如,A1={1},A3={1,2,3}。我们称一个非空子集元素的排列为一个子集序列。对所有的子序列按字典顺序排序。你的任务就是给出第m个子序列。
http://blog.youkuaiyun.com/lianqi15571/article/details/8877014
这个人的博客写的很详细了,我在此就不重复累述了,说白了,这道题就是找规律,发现这规律就能做出来了。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,n,t;
__int64 c[25]={0},m;
int s[25];
for(i=1;i<25;i++)
c[i]=c[i-1]*(i-1)+1;
while(scanf("%d%I64d",&n,&m)!=EOF)
{
for(i=0;i<25;i++)
s[i]=i;
while(n&&m)
{
t=m/c[n]+(m%c[n]>0?1:0);
if(t)
{
printf("%d",s[t]);
for(i=t;i<=n;i++)
s[i]=s[i+1];
m-=((t-1)*c[n]+1);
putchar(m==0?'\n':' ');
}
n--;
}
}
return 0;
}