原题链接:点击打开链接
康拓展开:
逆康拓展开:
应该可以看懂康拓了吧。。。
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");
}
}