codeforces #309 553B B. Kyoya and Permutation(斐波那契数)
2015-06-25 22:07
267 查看
题目链接:
点击打开链接
题目大意:
定义一种排列的标准循环表示法,也就是排列中先按每个循环内部的从大到小排序,然后以每个循环的最大值从小到大排序,问存在的第k小的符合要求的排列
题目分析:
首先有一点是一定要发现的,如果两个数在同一循环中
设他们的下标为i,j,i != j , 若i < j
那么换完之后ai = j , aj = i, ai > aj
如果i,j不相邻,那么存在k满足i<k<j,如果k和大于j的换,那么ak>aj,不合法
如果k和小于i的交换,那么ak<ai不合法
所以i=j-1
因为交换具有传递性,所以如果ai与aj交换,aj和ak交换,相当于ai和ak交换,而ai和ak不相邻,所以不合法
那么也就是得到一个结论:只有相邻的值可以交换,且每个数最多做一次交换
那么假设n的排列的合法的数量为dp
那么dp
= dp[n-1] + dp[n-2]
也就是第n个不和第n-1个交换,以及第n个和第n-1个交换的情况
那么第k个合法排列也就是,因为只可以得到相邻交换得到序位更大的合法序列,所以从最后一位开始,逐渐判断是否要交换即可,逐位确定最后要构造出序列的每一位即可
点击打开链接
题目大意:
定义一种排列的标准循环表示法,也就是排列中先按每个循环内部的从大到小排序,然后以每个循环的最大值从小到大排序,问存在的第k小的符合要求的排列
题目分析:
首先有一点是一定要发现的,如果两个数在同一循环中
设他们的下标为i,j,i != j , 若i < j
那么换完之后ai = j , aj = i, ai > aj
如果i,j不相邻,那么存在k满足i<k<j,如果k和大于j的换,那么ak>aj,不合法
如果k和小于i的交换,那么ak<ai不合法
所以i=j-1
因为交换具有传递性,所以如果ai与aj交换,aj和ak交换,相当于ai和ak交换,而ai和ak不相邻,所以不合法
那么也就是得到一个结论:只有相邻的值可以交换,且每个数最多做一次交换
那么假设n的排列的合法的数量为dp
那么dp
= dp[n-1] + dp[n-2]
也就是第n个不和第n-1个交换,以及第n个和第n-1个交换的情况
那么第k个合法排列也就是,因为只可以得到相邻交换得到序位更大的合法序列,所以从最后一位开始,逐渐判断是否要交换即可,逐位确定最后要构造出序列的每一位即可
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #define MAX 57 using namespace std; typedef long long LL; int n; LL dp[MAX],k; int num[MAX]; void init ( ) { dp[0] = dp[1] = 1; for ( int i = 2 ; i < MAX ; i++ ) dp[i] = dp[i-1] + dp[i-2]; } int main ( ) { init(); while ( ~scanf ( "%d%I64d" , &n , &k ) ) { for ( int i = 1 ; i <= n ; i++ ) { if ( k > dp[n-i] ) { k -= dp[n-i]; num[i] = i+1; num[i+1] = i; i++; } else num[i] = i; } for ( int i = 1 ; i <= n ; i++ ) printf ( "%d " , num[i] ); } }
相关文章推荐
- 程序员果真有前端后端客户端吗
- 牛腩新闻系统(五)——一些小技巧
- ProgressDialog show()的时候 12-18 11:05:55.356: E/AndroidRuntime(461): android.view.WindowManager$Ba
- iOS开发面试题(更新中...)
- 黑马程序员-IOS学习笔记(二)常用关键字和方法
- 库和框架的区别
- 手斧Linux – 从LFS到Funtoo (53)
- 写的手机安全卫士程序, 当服务器没有开启.程序执行到if(conn.getResponseCode() == 200)即conn.getResponseCode()时没反应了.
- 虚拟机中Centos7搭建本地仓库
- 分页插件之--kaminari
- . Refer to Hibernate 3.6 Migration Guide!
- BNUOJ 27935 我爱背单词 (加强版) (FFT)
- 笔记
- 从首份“电商职场报告”能看出什么
- 轻量级和企业级的区别
- IOS 第三方管理库管理 CocoaPods
- 虚基类——动物
- 代码中获取String.xml中的字符串?
- linux sort 命令详解
- beta 阶段的 postmortem 报告