Pure simulation law. Gradually determine each bit.
#include <stdio.h> #include <string.h> #include <algorithm>using namespace std; #define LL Long LONGLL Used[17];ll f[27],ans[38];ll sum[20];ll Len;char str[21];ll Jc () {ll s=1,i; ll X[28]; memset (x,0,sizeof (x)); for (i=1;i<=len;i++) if (ans[str[i]-' a ']!=0&&!used[i]&&!x[str[i]-' a ']) { s*=f[ans[str[i]-' A ']; x[str[i]-' A ']=1; } return s;} int main () {ll k; while (scanf ("%s%lld", str,&k)!=eof) {ll i,j; if (k==0&&str[0]== ' # ') break; Len=strlen (str); memset (used,0,sizeof (used)); Sort (Str,str+len); for (i=len;i>=1;i--) str[i]=str[i-1]; ll N=len; memset (ans,0,sizeof (ans)); for (i=1;i<=n;i++) {int v=str[i]-' A '; Ans[v]+=1; } f[1]=1; for (i=2;i<n;i++) f[i]=i*f[i-1]; for (i=1;i<n;i++) {sum[0]=0; InchT u=0,q=0; for (j=1;j<=n;j++) {if (used[j]) continue; if (str[j]==str[q]&&u!=0) continue; else {u++; Q=j; ans[str[j]-' A ']-=1; SUM[U]=F[N-I]/JC () +sum[u-1]; ans[str[j]-' A ']+=1; } if (sum[u]>=k) {printf ("%c", Str[j]); ans[str[j]-' A ']-=1; Used[j]=1; K-=SUM[U-1]; Break }}} for (i=1;i<=n;i++) if (!used[i]) printf ("%c", Str[i]); printf ("\ n"); } return 0;}
has a heavy string dictionary sequence K-permutation