讲解康托展开与逆康托展开。http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html
#include<bits/stdc++.h> using namespace std; int fac[20]; int fun(){ fac[0]=1; int i; for(i=1;i<=12;i++){ fac[i]=fac[i-1]*i; } } int main(){ int t,i,j,c,sum,num; char str[15]; fun(); scanf("%d",&t); while(t--){ scanf("%s",str); sum=0; for(i=0;i<12;i++){ num=0; for(j=i+1;j<12;j++){ if(str[i]>str[j]) num++; } sum+=num*fac[12-i-1]; } printf("%d ",sum+1); } return 0; }
//reverse #include<bits/stdc++.h> using namespace std; int fac[20],num[20]; int fun(){ fac[0]=1; int i; for(i=1;i<=12;i++){ fac[i]=fac[i-1]*i; } } int main(){ int t,i,j,b,c,sum,m; fun(); scanf("%d",&t); while(t--){ scanf("%d",&m); m--; for(i=0;i<13;i++){ num[i]=i; } for(i=0;i<12;i++){ b=m/fac[12-i-1]; printf("%c",num[b]+97); for(j=b;j<12;j++){ num[j]=num[j+1]; } m%=fac[12-i-1]; }printf(" "); } return 0; }