标题: 排列序数
X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
.....
在一处石头上刻的符号是:
bckfqlajhemgiodnp
请你计算出它表示的数字是多少?
请提交该整数,不要填写任何多余的内容,比如说明或注释。
X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
.....
在一处石头上刻的符号是:
bckfqlajhemgiodnp
请你计算出它表示的数字是多少?
请提交该整数,不要填写任何多余的内容,比如说明或注释。
355687428096000
public class 排列序数 {
/*a-q 一共17个数
* 康托展开式*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "bckfqlajhemgiodnp";
char[] a = input.toCharArray();
int[] number = new int[a.length];
for (int i = 0; i < number.length; i++) {
number[i] = a[i]-96;//得到每个字母对应数字大小排序;
}
long jiecheng[] = new long[17];
geijiechen(jiecheng);//0!->16!
long sum = 0;
for (int i = 16; i >= 0; i--) {
sum += jiecheng[i]*getan(number,i);
}
System.out.println(sum);
}
/*获得对应的Ai值*/
private static int getan(int[] number, int i) {
// TODO Auto-generated method stub
int count = 0;
for (int j = number.length-1-i; j < number.length; j++) {
if (number[j]<number[number.length-1-i]) {
count++;
}
}
return count;
}
private static void geijiechen(long[] jiecheng) {
// TODO Auto-generated method stub
jiecheng[0] = 1;
for (int i = 1; i < jiecheng.length; i++) {
jiecheng[i] =i*jiecheng[i-1];
}
}
}