您的位置:首页 > 其它

康托展开

2016-07-31 17:39 260 查看
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <map>
#define LL long long

using namespace std;

//X = a[1]*(n-1)!+a[2]*(n-2)!+...+a[i]*(n-i)!+...+a[n-1]*1!+a
*0!
//其中a[i]表示在num[i+1..n]中比num[i]小的数的数量

void Cantor(int nums[],int n)
{
int fact[15];
fact[0] = 1;
fact[1] = 1;
for(int i = 2; i <= 13; i++)
fact[i] = fact[i-1]*i;

int cnt = 0;
for(int i = 1; i <= n; i++)
{
int tmp = 0;
for(int j = i+1; j <= n; j++)
if(nums[j] < nums[i])
tmp++;
cnt +=  tmp * fact[n-i];
}
printf("%d\n",cnt+1);
}

void solve()
{
int nums[1000];
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&nums[i]);
Cantor(nums,n);
}

int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: