您的位置:首页 > 其它

NYOJ 139 我排第几个(康托展开)

2015-10-11 09:25 344 查看
根据康托展开,对于每一个字符,假设它后面有k个字符比它小,则当前序列的排序会增大k*f[12-i],其中f[i]是是i的阶乘。

该题就是康托展开的裸题,  利用康托展开,我们不仅可以快速的求某个排列是第几个排列,而且可以快速求出第几个排列是什么。    方法就是此题的逆。

关于康托展开,大家可以看这里:点击打开链接

细节参见代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
int main() {
long long f[15];
f[1]=1;
for(int i=2;i<=12;i++) {
f[i]=f[i-1]*i;
}
char s[15]; int t;
while(~scanf("%s",s+1)) {
long long sum=0;
for(int i=1;i<=12;i++) {
int k=0;
for(int j=i+1;j<=12;j++) {
if(s[i] > s[j]) k++;
}
sum+=f[12-i]*k;
}
printf("%I64d\n",sum+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm-icpc 数论