X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
…..
在一处石头上刻的符号是:
bckfqlajhemgiodnp
请你计算出它表示的数字是多少?
请提交该整数,不要填写任何多余的内容,比如说明或注释。
问题分析:这道题,用全排列直接搜,亲测,想在比赛时间里跑出来,估计是很困难的。。。用一个方法,康托展开,简单学习了一下
康托展开表示的是当前排列在n个不同元素的全排列中的名次。比如213在这3个数所有排列中排第3。
那么,对于n个数的排列,康托展开为:
其中表示第i个元素在未出现的元素中排列第几。举个简单的例子:
对于排列4213来说,4在4213中排第3,注意从0开始,2在213中排第1,1在13中排第0,3在3中排第0,即:
,这样得到4213在所有排列中排第ans=20
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
long long int n(int x)
{
if (x == 1)
return 1;
return x * n(x-1);
}
int main()
{
char s[20] = "bckfqlajhemgiodnp";
int flag[17];
long long int sum = 0;
memset(flag,0,sizeof(flag));
for(int i=0; i<16; i++)
{
int num = 0;
for(int j=0; j<s[i] - 'a'; j++)
{
if (flag[j] == 0) //表示第j个数没有排除,那么计数
num++;
}
flag[s[i] - 'a'] = 1;
sum += num * n(16 - i);
}
cout << sum << endl;
return 0;
}