康托展开

//康托,康托逆 
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[10010],f[10010];
void jiecheng(int n)
{
	f[0]=f[1]=1;
	for(int i=2;i<=n;i++)
	{
		f[i]=f[i-1]*i;
	}
}
signed main()
{
	cin>>n>>k;
	jiecheng(n);
	while(k--)
	{
		char c;
		cin>>c;
		if(c=='Q')
		{
			for(int i=1;i<=n;i++)
			{
				scanf("%lld",&a[i]);
			}
			int ans=1;
			for(int i=1;i<=n;i++)
			{
				int cnt=0;
				for(int j=i+1;j<=n;j++)
				{
					if(a[j]<a[i])
					cnt++;//有几个比a[i]小的 
				}
				ans+=cnt*f[n-i];
			}
			printf("%lld\n",ans);
		}
		if(c=='P')
		{
			int x;
			scanf("%lld",&x);
			x--;
			vector<int> g,ans;
			for(int i=1;i<=n;i++)
			{
				g.push_back(i);
			}
			for(int i=n;i>=1;i--)
			{
				int pos=x/f[i-1];
				x%=f[i-1];
				ans.push_back(g[pos]);
				g.erase(g.begin()+pos);
			}
			for(auto it=ans.begin();it!=ans.end();it++)
			{
				printf("%lld ",*it);
			}
			printf("\n");
		}
	}
	return 0;
} 

  

posted @ 2022-12-02 17:57  Herkaii  阅读(31)  评论(0)    收藏  举报