首先想一下如何获得编号呢? 暴力一定是不可以,所以我们一定要思考一下一个时间复杂度小的算法 。
这个排列的编号==它前面的所有的排列数+1
文章插图
例: 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;}
- 学口腔医学还是学计算机,我国口腔医学的这“四大家族”,最受学霸欢迎
- 通过子网掩码,计算子网数和主机数
- 丝杆电机选型计算公式,请问丝杠的选型怎么计算
- Excel Speedoffice如何计算指定日期后续N天的日期
- 年化率,夏普率,最大回撤计算方法
- 2 Python:上机练习——计算y年m月有几天
- 水平 软考——全国计算机技术与软件专业技术资格考试
- IP地址和子网掩码的关系, 如何计算网络地址?
- 德州学院计算机系吧,德州学院计算机系教研室工作职责.doc
- 考研计算机350分相当于什么水平