您的位置:首页 > 其它

逆康托展开

2016-08-01 09:12 176 查看
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <map>
#define LL long long

using namespace std;

void unCantor(int X,int n)
{
int a[20],num[20],used[20];
int fact[15];
memset(used,0,sizeof(used));
fact[0] = fact[1] = 1;
for(int i = 2; i <= 15; i++)
fact[i] = fact[i-1]*i;

for(int i = 1; i <= n; i++)
{
a[i] = X/fact[n-i];
X %= fact[n-i];
int cnt = 0;
for(int j = 1; j <= n; j++)
{
if(!used[j])
cnt = cnt+1;
if(cnt == a[i] + 1)
{
num[i] = j;
used[j] = 1;
break;
}
}
}
for(int i = 1; i <= n; i++)
printf("%d%c",num[i],i == n?'\n':' ');
}

void solve()
{
int n,X;
scanf("%d %d",&X,&n);
unCantor(X,n);
}

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