标签:第k个排列
这个题目就是求一个序列的第k个字典序排序,因为k比较大所以我们不能穷举,而是用其它的方法求。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
char str[20];
int cc[30];
ll fac[20],k;
ll GetNum(int cnt)
{
ll ans=fac[cnt];
for(int i=0;i<26;i++)
ans/=fac[cc[i]];
return ans;
}
void solve(int len)
{
for(int i=0;i<len;i++)
for(int j=0;j<26;j++)
{
if(cc[j])
{
cc[j]--;
ll d=GetNum(len-i-1);
cc[j]++;
if(d>=k)
{
cc[j]--;
printf("%c",‘A‘+j);
break;
}
else
k-=d;
}
}
}
int main()
{
fac[0]=1;
for(int i=1;i<=17;i++)
fac[i]=fac[i-1]*i;
while(scanf("%s %lld",str,&k))
{
if(k==0)
break;
memset(cc,0,sizeof(cc));
int len=strlen(str);
for(int i=0;i<len;i++)
cc[str[i]-‘A‘]++;
solve(len);
printf("\n");
}
return 0;
}
标签:第k个排列
原文地址:http://blog.csdn.net/acm_lkl/article/details/44905177