康托展开
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; }