[loj3276]遗迹
假设已知$a_{i}$,通过以下方式确定$b_{i}$:从后往前枚举每一个数$i$,先令$b_{i}=a_{i}$,再将$b_{i}$不断减1直至不存在$j>i$且$b_{i}=b_{j}$或$b_{i}=0$
令$f[i][j]$表示考虑到$i$时满足$mex(\{b_{i},...,b_{n}\})=j+1$且合法的方案数,转移比较复杂,考虑如何从$i+1$递推到$i$,分三类讨论:
1.$i\notin S$($S$为给定集合),注意到一个数为0当且仅当其以及比其小的数都已经被填过,因此$a_{i}$必然要填$[1,j]$中的数,且填的方案数为$j-((2n-i)-\sum_{x\in S,x>i}1)$
(这里由于并不能保证$[1,j]$作为$a_{i}$都填过,因此实际上可能出现的数字种类数没有这么多,但不妨假设同种数字的两个不相同,最终答案再除以$2^{n}$即可)
2.$i\in S$且最终未使得$j$增大,暂时不考虑他(在下一次使$j$增大时考虑)
3.$i\in S$且最终使得$j$增大,枚举最终增大到的$k$($k>j$),那么相当于填$\sum_{x\in S,x>i}1-j$个位置,使得最终覆盖了$(j,k]$($b_{i}$必然为$j+1$,同时有$k-j+1$种填法)
令$l=k-j-1$,先选出非0的$l$个位置,即$c(\sum_{x\in S,x>i}1-j,l)$,那么对于$l$个位置,合法等价于任意权值小于等于$i$(其实是$i+j+1$,但不妨都减去$j+1$,因此$1\le i\le l$)的位置个数不超过$i$个
设$g[i][j]$表示填$i$个位置且对$l=j$合法的方案数,考虑$j$填了几个(不会超过两个),就可以得到转移:$g[i][j]=g[i][j-1]+2i\cdot g[i-1][j-1]+i(i-1)\cdot g[i-2][j-1]$
$2i$表示填1个$j$,由于每一种数的两个元素不同,因此有$2i$种;$i(i-1)$表示填2个$j$,任选两个位置即可(还是由于不同)
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 605
4 #define mod 1000000007
5 int n,x,ans,vis[N<<1],fac[N],inv[N],g[N][N],f[N<<1][N];
6 int c(int n,int m){
7 if (n<m)return 0;
8 return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
9 }
10 int main(){
11 fac[0]=inv[0]=inv[1]=1;
12 for(int i=1;i<N-4;i++)fac[i]=1LL*fac[i-1]*i%mod;
13 for(int i=2;i<N-4;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
14 for(int i=2;i<N-4;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
15 for(int i=0;i<N-4;i++)g[0][i]=1;
16 for(int i=1;i<N-4;i++)
17 for(int j=i;j<N-4;j++){
18 g[i][j]=(g[i][j-1]+2LL*i*g[i-1][j-1])%mod;
19 if (i>1)g[i][j]=(g[i][j]+1LL*i*(i-1)*g[i-2][j-1])%mod;
20 }
21 scanf("%d",&n);
22 for(int i=1;i<=n;i++){
23 scanf("%d",&x);
24 vis[x]=1;
25 }
26 x=0;
27 f[2*n+1][0]=1;
28 for(int i=2*n;i;i--){
29 for(int j=0;j<=n;j++)
30 if (!vis[i])f[i][j]=1LL*f[i+1][j]*(j-(2*n-i-x))%mod;
31 else{
32 f[i][j]=(f[i][j]+f[i+1][j])%mod;
33 for(int k=j+1;k<=n;k++)f[i][k]=(f[i][k]+1LL*c(x-j,k-j-1)*(k-j+1)%mod*g[k-j-1][k-j-1]%mod*f[i+1][j])%mod;
34 }
35 if (vis[i])x++;
36 }
37 ans=f[1][n];
38 for(int i=1;i<=n;i++)ans=1LL*ans*(mod+1)/2%mod;
39 printf("%d",ans);
40 }
[loj3276]遗迹的更多相关文章
- Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】
正题 题目链接:https://ac.nowcoder.com/acm/contest/72/F 题目大意 \(n\)个字符串,包括小写字母和\(\#\).其中\(\#\)可以替换为任意字符串.求有多 ...
- 为什么WebSphere好好的,他就不干活了?
“修理不好用的WebSphere,有时候要看运气.”这个是我接触过很过有历史的运维工程师经常说的一个梗;研发人员也经常说这个程序在我这里运行好好的,怎么到你那就不灵了?问题是你的,你自己解决. 声明一 ...
- LayaAir引擎——(十)
var k = new Array(); var l = new Array(); var m = new Array(); var zhiyeCurosr = 0; function zyinit( ...
- Swift让编程更简单 人人都是开发者
全称为苹果全球开发者大会的WWDC,每年的这个时候,都会如这段时间前后所举行的Google I/O 和微软的BUILD开发者会议一样,吸引全球科技媒体的目光.近几年来,因为在会上爆的猛料越来越多,“开 ...
- (一)GATT Profile和GAP 简介(目前所有的BLE应用都基于GATT,所以也要了解是怎么一回事)-转发
个人大总结:(先后顺序) 1.GAP协议定义多个角色(其中就有中心设备[GATT客户端](唯一)叫主设备||和外围设备[GATT服务端端](多个)也叫从设备). 2.先经过GAP协议,再有GATT协议 ...
- C#访问Azure的资源
官方参考资料在这里:https://msdn.microsoft.com/en-us/library/azure/dn722415.aspx,本文放一些重点及遇到的坑的解决办法. 身份验证 不是说,我 ...
- 福建红色文化VR/AR实体体验馆正式启用
(12月13日),福建红色文化网上展示馆上线暨福建红色文化VR/AR实体体验馆启动仪式在福建省革命历史纪念馆举行.省委常委.宣传部长高翔出席仪式并宣布启动上线. 福建红色文化网上展示馆和VR/AR实体 ...
- Node.js的核心与红利(zz)
唯有明晰历史,才能了然当下,预知未来.作者从历史角度解读Node.js,帮助读者透过猜忌和谣言,看清真实的Node.js,了解Node.js的核心与红利. 令人惴惴不安的Node.js 我们越来越频繁 ...
- Objective-C学习笔记-第一天(1)
.h头文件,用于声明一些公开的属性.方法.头文件一般不会放太多的东西,没必要暴露太多接口,私有和封装. .m主文件,用于实现.h文件中的方法,以及一些其它的方法. -(返回值)方法名参数1名称:(参数 ...
随机推荐
- Parcel Fabric Tools(宗地结构工具)
宗地结构工具 1.图层和表视图 # Process: 创建宗地结构图层 arcpy.MakeParcelFabricLayer_fabric("", 输出图层) # Process ...
- Java(28)集合三Map
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228436.html 博客主页:https://www.cnblogs.com/testero ...
- 036—环境变量path
day04 课堂笔记 1.开发第一个java程序:HelloWorld 1.1.程序写完以后,一定要ctrl+s进行保存 源代码若修改,需重新进行编译 1.2.编译阶段 怎么编译?使用什么命令?这个命 ...
- Kali安装OWASP
我是2019版的kali,里面并没有自带OWASP工具,因为OWASP不再更新的因素,所以新版kali将它移除了 安装OWASP apt-get install zaproxy #以下都是安装软件时 ...
- mipi csi接口,1条lane支持多少像素,200w像素需要几条lane,为什么,怎么计算出来的?谢谢!
按帧频FRAME=60HZ, 分辨率480*800来计算;以WVGA 显示分辨率,24BIT图片,60幁为例,在理想状态下(未包含RGB信号前后肩宽度),总传输速率最小为:480*800*8BIT*3 ...
- Netty:Netty中的零拷贝(Zero Copy)
零复制概念: " 零复制"描述了计算机操作,其中CPU不执行将数据从一个存储区复制到另一个存储区的任务.通过网络传输文件时,通常用于节省CPU周期和内存带宽. WIKI的定义中,我 ...
- 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列
题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...
- 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义
最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...
- Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间 (转载)
在windows下,一个文件有:创建时间.修改时间.访问时间. 而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就 ...
- 设计模式学习-使用go实现建造者模式
建造者模式 定义 适用范围 与工厂模式的区别 优点 缺点 参考 建造者模式 定义 Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式. 建造者模式(Builder Patt ...