蓝桥杯 模拟 排列序数
题目描述
X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
.....
在一处石头上刻的符号是:
bckfqlajhemgiodnp
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
.....
在一处石头上刻的符号是:
bckfqlajhemgiodnp
输入
请你计算出它表示的数字是多少?
分析 本题涉及到了康托展开
放一个介绍康托展开的链接 http://blog.csdn.net/zhongkeli/article/details/6966805
要注意的是阶乘的函数返回值为long long
储存数目的变量也要定义为long long
代码
#include <bits/stdc++.h> using namespace std; int vis[200]; char c[200]; long long fac(int x) { if(x==1) return 1; else return x*fac(x-1); } int main() { long long sum; memset(vis,0,sizeof(vis)); int h; while(cin>>c) { sum=0; h=0; int L=strlen(c); for(int i=0;i<L-1;i++) { h=0; vis[c[i]]=1; for(int j='a';j<c[i];j++) { if(!vis[j]) h++; } sum+=(h*fac(16-i)); cout<<" "<<sum<<endl; } cout<<sum<<endl; } return 0; }