A decorative fence

在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i-1}>a_i<a_{i+1}\))排列方案才是合法的,询问合法的第c个方案的全排列,\(n\leq 20,c\leq 2^{63}\)。

首先是求第几个方案,自然要用试填法,而排列问题不同于普通递推,因为一个数被放在这一个位置就不能在放了,但是注意到排列的一个性质,也就是注重大小关系,故可以考虑离散化递推。

为了试填,自然表现最左端填什么,也要表现序列的长度,为了能够维护序列的合法,不妨把最左端\(a_i>a_{i+1}\)记做,否则记做0,所以设\(f[i][j][k]\)表示长度为i的排列,最左端的数为第j大的数,状态为k的方案数,不难有

\[f[i][j][0]=\sum_{k=j}^{i-1}f[i-1][k][1]
\]

\[f[i][j][1]=\sum_{k=1}^{j-1}f[i-1][k][0]
\]

边界:\(f[1][1][0]=f[1][1][1]=1\),其余为0

于是我们就可以直接利用方案数从小到大试填了,注意第一个位置状态可1,可0,优先填1即可。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define ll long long
using namespace std;
bool used[21];
ll dp[21][21][2];
il void prepare();
int main(){
int lsy;scanf("%d",&lsy),prepare();
while(lsy--){
int n,last;bool p;ll c;
memset(used,0,sizeof(used));
scanf("%d%lld",&n,&c);
for(int i(1);i<=n;++i){
if(dp[n][i][1]>=c){
last=i,p=1;
break;
}
else c-=dp[n][i][1];
if(dp[n][i][0]>=c){
last=i,p=0;
break;
}
else c-=dp[n][i][0];
}printf("%d ",last),used[last]|=true;
for(int i(2),j,k;i<=n;++i){
p^=true;
for(j=1,k=0;j<=n;++j){
if(used[j])continue;++k;
if((p&&j>last)||(!p&&j<last))
if(dp[n-i+1][k][p]>=c){
last=j,used[j]|=true;
break;
}
else c-=dp[n-i+1][k][p];
}printf("%d ",last);
}putchar('\n');
}
return 0;
}
il void prepare(){
dp[1][1][0]=dp[1][1][1]=1;
for(int i(2),j,k;i<=20;++i)
for(j=1;j<=i;++j){
for(k=j;k<i;++k)dp[i][j][0]+=dp[i-1][k][1];
for(k=1;k<j;++k)dp[i][j][1]+=dp[i-1][k][0];
}
}

最新文章

  1. springJDBC学习笔记和实例
  2. 《30天自制操作系统》04_day_学习笔记
  3. Metadata Lock原理6
  4. Javascript注意事项三【使用假值】
  5. LanSoEditor_common ---android平台的视频编辑SDK
  6. Openjudge-计算概论(A)-整数奇偶排序
  7. ngrok把本地主机映射到公网域名
  8. Akka(10): 分布式运算:集群-Cluster
  9. 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
  10. 网络实时流量监控工具iftop---转
  11. Erlang和Web
  12. Mac OS Eclipse 调试快捷键不好使(失效)的情况
  13. 在Linux下用C语言实现短信收发
  14. WCF- 契约Contract(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)(转)
  15. libgdx学习记录7——Ui
  16. Eclipse的一些常用的快捷键
  17. HP-UNIX操作系统root账号被锁定的两种解决方法
  18. CentOS7布署.Net Core
  19. 1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
  20. ACM 第二十天

热门文章

  1. 【二】Jmeter接口自动化测试系列之函数使用及扩展
  2. MacOS安装npm全局包的权限问题
  3. C#WinForm 窗体回车替换Tab
  4. Linux文件介绍
  5. Ubuntu 常用软件记录【持续更新】
  6. PWM,SBUS,PPM信号转模拟电压的方案
  7. H5新增的postMessage跨域解决方案Demo
  8. Linux 系统分区与目录介绍
  9. springcloud分布式事务TXLCN
  10. Allow Pin Swapping Using these Methods options