您的位置:首页 > 其它

NYOJ139我排第几个

2016-04-08 20:31 429 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=139

康托展开:

公式神马的我都看不懂,但我会用!

举个栗子, 1324 在{1,2,3,4}这个排列中是第几个小的,先看第1位,比1小的有0个,所以有0 * 3!,第2位,比3小的有1个2(3前面的不用看),所以有1 * 2!个,在看第3位,比2小的是0个,所以 0 * 1!,第4位就不用看了。。。所以 0*3! + 1 * 2! + 0 * 1! = 2,所以1324是第三小的数。。

代码:

#include <cstdio>
#include <cstring>

int n;

char s[20];
int fac[] = {1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};

int main()

{

while(~scanf("%d",&n))
{
while(n--)
{
long long ans = 0;
scanf("%s",s);
int len = strlen(s);
int t = 11;
for(int i = 0;i < len;++i)
{
int cnt = 0;
for(int j = i + 1;j < len;++j)
{
if(s[j] < s[i])
cnt++;
}
ans += cnt * fac[t--];
}
printf("%lld\n",ans + 1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: