[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名称:(参数 ...
随机推荐
- 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?
"ShardingSphere 作为 openGauss 生态的开源分布式数据库解决方案,将持续助力于 openGauss,满足千行百业广大客户分布式场景需求." 5月29日,由 ...
- 解决VSCODE"因为在此系统上禁止运行脚本"报错
在VSCODE中使用yarn,结果报错: 找了下原因,是因为PowerShell执行策略的问题. 解决方法: 以管理员身份运行vscode; 执行:get-ExecutionPolicy,显示R ...
- Java基础之(四):使用IDEA实现HelloWorld
使用IDEA实现HelloWorld 在使用IDEA这个集成开发环境写Java程序之前,我们要先对IDEA进行一些基本的配置,以便我们能够更好地使用它. 新建一个空项目,用来学习基础语法 设置项目名称 ...
- Frida高级逆向-Hook Java
Frida Hook Java 层 Frida两种启动方式的区别 span 模式:frida 重新打开一个进程 frida -U -f 包名 -l js路径 --no-pause attch 模式: ...
- Java(3)基本数据类型及其类型转换
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201501.html 博客主页:https://www.cnblogs.com/testero ...
- CQL和SQL的CRUD操作比较
数据进行CRUD操作时,CQL语句和SQL语句的异同之处. 1.建表 2.CRUD语句比较 3.总结 1.建表 在此之前先分别创建两张表,插入数据,用来测试然后进行比较 在SQL数据库里面创建表 在C ...
- Java字符串分割函数split源码分析
spilt方法作用 以所有匹配regex的子串为分隔符,将input划分为多个子串. 例如: The input "boo:and:foo", for example, yield ...
- Codeforces1514B
问题描述 给你两个数n,k,问可以构造多少n个最大位数为k数按位与为0并且这n个数加起来最大的合法序列,答案对1e9 + 7取模. 思路分析 首先我们考虑这n个数按位与以后为0这个条件:我们可以知道, ...
- Scrum Meeting 15
第15次例会报告 日期:2021年06月09日 会议主要内容概述: 开发工作接近尾声,接下来两天重点放在单元测试.调CSS和增加数据集数量上. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链 ...
- UltraSoft - Beta - Scrum Meeting 10
Date: May 26th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 暂无 Kkkk 前端 前端增加了 ...