您的位置:首页 > 其它

蓝桥 排列序数(康托展开)

2018-03-25 21:51 281 查看
标题: 排列序数

X星系的某次考古活动发现了史前智能痕迹。 
这是一些用来计数的符号,经过分析它的计数规律如下: 
(为了表示方便,我们把这些奇怪的符号用a~q代替)

abcdefghijklmnopq 表示0 
abcdefghijklmnoqp 表示1 
abcdefghijklmnpoq 表示2 
abcdefghijklmnpqo 表示3 
abcdefghijklmnqop 表示4 
abcdefghijklmnqpo 表示5 
abcdefghijklmonpq 表示6 
abcdefghijklmonqp 表示7 
…..

在一处石头上刻的符号是: 
bckfqlajhemgiodnp

请你计算出它表示的数字是多少?

康拓展开求排列的次序,注意从零开始。
X=a
*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!

还可以利用康托逆展开求排在某一次序的排列。#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int vis[20];

ll jiecheng(ll x){
if(x==0)
return 1;
return x*jiecheng(x-1);
}

int main(){
string s="bckfqlajhemgiodnp";
ll sum=0;
for(int i=1; i<=s.size(); i++)
{
ll num=0;
for(int j=0; j<s[i-1]-'a'; j++)
if(!vis[j])
num++;
vis[s[i-1]-'a']=1;
sum+=num*jiecheng(ll(s.size()-i));
}
printf("%lld\n", sum);
return 0;
}22952601027516
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: