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\n",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("\n");

    }

    return 0;

}

  

你可能感兴趣的:(OJ)