Subset sequence
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4636 Accepted Submission(s):
2248
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
Author
LL
Source
Recommend
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main() 5 { 6 int i,n,t; 7 __int64 m,c[21]= {0}; 8 int s[21]; 9 for(i=1; i<21; i++) 10 c[i]=c[i-1]*(i-1)+1; 11 while(~scanf("%d%I64d",&n,&m)) 12 { 13 for(i=0; i<21; i++) 14 s[i]=i; 15 while(n>0&&m>0) 16 { 17 t=m/c[n]+(m%c[n]>0?1:0); 18 if(t>0) 19 { 20 printf("%d",s[t]); 21 for(i=t; i<=n; i++) 22 s[i]=s[i+1]; 23 m-=((t-1)*c[n]+1); 24 if(m==0) printf(" "); 25 else printf(" "); 26 } 27 n--; 28 } 29 } 30 return 0; 31 }