康托展开小结-

Posted oieredsion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了康托展开小结-相关的知识,希望对你有一定的参考价值。

 

顺 阶乘乘上当前没用过的
逆 除以+1 为当前的数 +%

可约等于哈希 记录状态

代码

 

 

//
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long s[110];
long long p[110]= 1,1,2,6,24,120,720,5040,40320,362880;
long long pp[110]= 1,1,2,6,24,120,720,5040,40320,362880;
long long ss[120];
char a[20000];
long long x;
void nikangtuo(long long n,long long k,long long ss []) 
	long long i,j,t,flag[15]= 0;
	k--;
	for(long long i=1; i<=n; i++) 
		t=k/pp[n-i];
		for( j=1; j<=n; j++)
			if(!flag[j]) 
				if(t==0) break;
				t--;
			
		ss[i]=j;
		flag[j]=1;
		k%=p[n-i];
	

long long kangtuo() 
	long long i,j,temp,num;
	num=s[1]*p[n-1]-p[n-1];
	for(long long i=2; i<=n; i++) 
		temp=0;
		for(long long j=1; j<i; j++) 
			if(s[j]<s[i]) temp++;
		
		num=num+(s[i]-temp-1)*p[n-i];

	
	return num+1;


int main() 
	cin>>n>>m;
	long long q;
	while(m--) 
		cin>>q;
		if(q==1) 
			cin>>a;
			for(long long i=0; i<strlen(a); i++) 
				s[i+1]=a[i]-‘0‘;
			
			cout<<kangtuo()<<endl;
		 else 
			cin>>x;
			nikangtuo(n,x,ss);
			for(long long i=1; i<=n; i++)
				cout<<ss[i];
			cout<<endl;
		
	

以上是关于康托展开小结-的主要内容,如果未能解决你的问题,请参考以下文章

康托展开 & 逆康托展开

LG5367 「模板」康托展开 康托展开

[学习][Math]康托展开和逆康托展开

哈希!简康托展开与逆康托展开

康托展开和逆康托展开

数据结构——康托展开与逆康托展开