DFS( int pos, int id, long long num )
表示计算到第pos位,遍历到字母id,要求剩下的第num个
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
char s[30];
char ans[30];
int cnt[26];
int length;
long long N;
long long A[22];
void init(){
A[0] = 1;
for( int i = 1; i <= 20; i++ ){
A[i] = i * A[i-1];
}
}
long long calc(){
long long temp1 = 0, temp2 = 1;
for( int i = 0; i < 26; i++ ){
temp1 += cnt[i];
temp2 *= A[cnt[i]];
}
return A[temp1] / temp2;
}
bool DFS( int pos, int id, long long num ){
if( pos >= length ){
return true;
}
if( id >= 26 && num != 0 ){
return false;
}
if( cnt[id] == 0 ){
return DFS( pos, id + 1, num );
}
cnt[id]--;
long long sum = calc();
if( num <= sum ){
ans[pos] = 'a' + id;
return DFS( pos + 1, 0, num );
}
cnt[id]++;
return DFS( pos, id + 1, num - sum );
}
int main(){
int T, Case = 1;
init();
scanf( "%d", &T );
while( T-- ){
scanf( "%s%lld", s, &N );
length = strlen( s );
memset( cnt, 0, sizeof( cnt ) );
for( int i = 0; i < length; i++ ){
cnt[s[i]-'a']++;
}
ans[length] = '\0';//注意这里!
if( DFS( 0, 0, N ) ){
printf( "Case %d: %s\n", Case++, ans );
}else{
printf( "Case %d: Impossible\n", Case++ );
}
}
return 0;
}