蓝桥杯-2017模拟赛本科试题-排列序数-java
借鉴此博客所写哦 2017蓝桥杯模拟赛 Problem C: 排列序数(21分)
题目
X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
…..在一处石头上刻的符号是:
bckfqlajhemgiodnp请你计算出它表示的数字是多少?
请提交该整数,不要填写任何多余的内容,比如说明或注释。
思考
根据题意,可知题目计算的为全排列的次数
然后找规律
0123 0 0*3! + 0*2! + 0*1! = 0
0132 1 0*3! + 0*2! + 1*1! = 1
0213 2 0*3! + 1*2! + 0*1! = 2
0231 3 0*3! + 1*2! + 1*1! = 3
0312 4 0*3! + 2*2! + 0*1! = 4
0321 5 0*3! + 2*2! + 1*1! = 5
1023 6 1*3! + 0*2! + 0*1! = 6
1032 7 1*3! + 0*2! + 1*1! = 7
1203 8 1*3! + 1*2! + 0*1! = 8
1230 9 1*3! + 1*2! + 1*1! = 9
1302 10 1*3! + 2*2! + 0*1! = 10
1320 11 1*3! + 2*2! + 1*1! = 11
2013 12 2*3! + 0*2! + 0*1! = 12
2031 13 2*3! + 0*2! + 1*1! = 13
2103 14 2*3! + 1*2! + 0*1! = 14
2130 15 2*3! + 1*2! + 1*1! = 15
2301 16 2*3! + 2*2! + 0*1! = 16
2310 17 2*3! + 2*2! + 1*1! = 17
3012 18 3*3! + 0*2! + 0*1! = 18
3021 19 3*3! + 0*2! + 1*1! = 19
3102 20 3*3! + 1*2! + 0*1! = 20
3120 21 3*3! + 1*2! + 1*1! = 21
3201 22 3*3! + 2*2! + 0*1! = 22
3210 23 3*3! + 2*2! + 1*1! = 23
代码
public class Main{
public static void main(String[] args) {
String str = "bckfqlajhemgiodnp" ;
long fs[] = new long[17] ;
fs[0] = 1;
for(int i = 1 ; i < 17 ; i++){//1~16的阶乘
fs[i] = fs[i-1] * i ;
}
long sum = 0;
for(int i = 0 ; i < 16 ; i++){
char tempCh = str.charAt(i);
int k = 0 ;
for(int j = i + 1 ; j < 17 ; j ++){
if(tempCh-'a' > str.charAt(j)-'a'){
k ++ ;
}
}
sum += k * fs[16 - i] ;
}
System.out.println(sum);
}
}