nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开

讲解康托展开与逆康托展开。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;
}

  

原文地址:https://www.cnblogs.com/chengsheng/p/4659095.html