求助
  • 板块灌水区
  • 楼主never_check
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/23 21:02
  • 上次更新2023/12/23 22:32:27
查看原帖
求助
539861
never_check楼主2023/12/23 21:02

0、1、2三个数字的全排列有六种,按照字母序排列如下:   012、021、102、120、201、210   输入n, M   求0~n-1十个数的全排列中的第M个(第1个为0 1 2 3 4 .. n-1)。

10 1

0 1 2 3 4 5 6 7 8 9

#include<bits/stdc++.h>
using namespace std;
long long  n,m,a[35],b[35],jc[35];
int main(){
  cin>>n>>m;
  jc[1]=1;
  for(long long i=2;i<=19;i++){
  	jc[i]=jc[i-1]*i;
  } 
  for(long long i=1;i<=n;i++){
  	for(long long j=0;j<n;j++){
  		if(b[j]==0){
  			long long wei=j;
  			for(long long k=1;k<i;k++){
  				if(a[k]<j)wei--;
  			}
  			if(m>wei*jc[n-i]){
  				a[i]=j;
  			}
  			else break;
  		}
  	}
  	long long g=a[i];
  	for(long long k=1;k<i;k++){
  		if(a[k]<a[i])g--;
  	}
  	m-=g*jc[n-i];
  	b[a[i]]=1;
  }
  for(int i=1;i<=n;i++){
  	cout<<a[i]<<" ";
  }
  return 0;
}
2023/12/23 21:02
加载中...