NYOJ 139 我排第几个 和 NYOJ 143 第几是谁? 【康拓展开和逆康拓展开】

来源:互联网 发布:九城软件多少钱 编辑:程序博客网 时间:2024/04/28 16:38

原题链接:点击打开链接

康拓展开:

     链接:点击打开链接   和  点击打开链接

逆康拓展开:

    链接:点击打开链接  和  点击打开链接

应该可以看懂康拓了吧。。。


139 康拓展开 代码:

 #include<stdio.h>#include<string.h>int f(int n){int sum=1,a;for(a=2;a<=n;a++)sum*=a;return sum;}int main(){int a,b,c,n,m;scanf("%d",&n);getchar();while(n--){int ok[15],sum,max;int ac[15]={0};char ch1;a=0;max=0;while(scanf("%c",&ch1)&&ch1!='\n')ok[a++]=ch1-'a'+1;for(b=0;b<a-1;b++){sum=0;ac[ok[b]]=1;for(c=1;c<ok[b];c++){if(ac[c]==0)sum++;}max+=sum*f(a-b-1);}printf("%d\n",max+1);}}        

143 逆康拓展开 代码:

 #include<stdio.h>#include<string.h>long long sum[15]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600}; //存的是0~12的阶乘..int main(){long long k,a,b,m,n,i,j;scanf("%lld",&k);while(k--){long long max;int ok[15];memset(ok,0,sizeof(ok));scanf("%lld",&max);max--;//注意。。for(a=12;a>0;a--){j=max/sum[a-1];i=0;max=max%sum[a-1];for(b=1;b<=12;b++){if(ok[b]==0){i++;}                if(i==j+1)                 break;}printf("%c",b+96);ok[b]=1; //标记。。}printf("\n");}}