推出子集每一個n的位數的規律 num[ n ] = n * (num[ n - 1 ] + 1 ) ;
然後進行枚舉記錄位數,下面的思路是參考別人的 ,我的相較復雜好多,這個優化好多。
[cpp]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std ;
const int maxn = 25 ;
long long num[ maxn ] ;
int n ;
long long m ;
int main()
{
int i ;
int ans[ maxn ] ;
int used[ maxn ] ;
int temp1 , temp2 ;
num[ 1 ] = 1 ;
for( int i = 2 ; i <= 25 ; i ++ )
num[ i ] = i * ( num[ i - 1 ] + 1 ) ;
while( cin >> n >> m )
{
memset( used , 0 , sizeof( used ) ) ;
int cnt = 0 ;
while( cnt < n )
{
if( m == 0 )
break ;
for( i = 1 ; i <= n ; i++ )
{
if( used[ i ] )
continue ;
if( m > num[ n - cnt - 1 ] + 1 )
m -= num[ n - cnt - 1 ] + 1 ;
else
{
ans[ ++cnt ] = i ;
m-- ;
used[ i ] = 1 ;
break ;
}
}
}
for( i = 1 ; i < cnt ; i++ )
cout << ans[ i ] << " " ;
cout << ans[ cnt ] << endl ;
}
return 0 ;
}