蓝桥杯 模拟 排列序数

题目描述

X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用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;
 } 

 

posted @ 2017-04-04 13:05  hinata_hajime  阅读(1056)  评论(0编辑  收藏  举报