11. 计算排列的编号【组合数学】

首先想一下如何获得编号呢? 暴力一定是不可以,所以我们一定要思考一下一个时间复杂度小的算法 。
这个排列的编号==它前面的所有的排列数+1

11. 计算排列的编号【组合数学】

文章插图
例: 3 2 1
先看第一位是3,比它小的,且目前还没用的数字的有2个分别是 1 2.
那么以 1开头的 2开头的都是它前面的排列 后面还剩余俩数随便的排 。即 22!
接着 3 2 比2小的,且目前还没用的数字的有1个是1.
【11. 计算排列的编号【组合数学】】故 前面的排列是 11!。。。。。以此类推
#includeusing namespace std;typedef long long int LL;const int N=25;LL f[N];void init()//预处理阶乘{f[0]=1;for(int i=1;i<=20;i++) f[i]=f[i-1]*i;}void solve(){int n; cin>>n;vectorve(n+1);vectorst(n+1,1);//初始化为1 表示每一个数还没用for(int i=0;i>ve[i];LL skip=0;for(int i=0;i>t;while(t--) solve();return 0;}