火题大战Vol.0 B

题目描述

\(n\) 个沙茶,被编号 \(1\)~$ n$。排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1\))就行;

现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。

输入格式

只有一行且为用空格隔开的一个正整数 \(N\)。

输出格式

一个非负整数,表示方案数对 \(7777777\) 取模。

样例

样例输入

4

样例输出

2

样例解释

有两种方案 \(2\ 4\ 1\ 3\) 和 \(3\ 1\ 4\ 2\)

数据范围与提示

对于\(30\%\)的数据满足\(N \leq 20\)

对于\(100\%\)的数据满足\(1 \leq N \leq 1000\) ;

分析

我们设 \(f[i][j][0]\) 为填了 \(1\)到\(i\),当前有 \(j\) 对两两之间相差一的人,并且\(i\)和\(i-1\)不相邻的方案数

设 \(f[i][j][1]\) 为填了 \(1\)到\(i\),当前有 \(j\) 对两两之间相差一的人,并且\(i\)和\(i-1\)相邻的方案数

对于\(f[i][j][0]\),如果我们在这\(j\)对人的中间插入一个数,那么两两之间相差一的人会少一对,因为此时\(i\)和\(i-1\)不相邻

转移方程 \(f[i+1][j-1][0]+=j \times f[i][j][0]\)

如果我们在\(i\)的旁边插入\(i+1\),那么两两之间相差一的人会多一对,并且\(i\)和\(i+1\)相邻,因此会转移至 \(f[i+1][j+1][1]\)

转移方程 \(f[i+1][j+1][1]+=2 \times f[i][j][0]\)

此时,我们在剩下的位置插入不会对对数产生影响,即

\(f[i+1][j][0]+=(i-1-j) \times f[i][j][0]\)

对于\(f[i][j][1]\) 如果我们在\(i\)和\(i-1\)的中间插入\(i+1\),则有

\(f[i+1][j][1]+=f[i][j][1]\)

如果我们在\(i\)的另一边插入\(i+1\),则有

\(f[i+1][j+1][1]+=f[i][j][1];\)

如果我们在其它的 \(j-1\) 个空位中插入,则有

\(f[i+1][j-1][0]+=f[i][j][1]*(j-1)\)

如果我们在其它的空位中插入,则有

\(f[i+1][j][0]+=f[i][j][1]*(i-j)\)

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
#define int long long
int f[maxn][maxn][3];
const int mod=7777777;
signed main(){
int n;
scanf("%lld",&n);
f[2][1][1]=2;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
f[i+1][j-1][0]+=j*f[i][j][0];
f[i+1][j-1][0]%=mod;
f[i+1][j+1][1]+=2*f[i][j][0];
f[i+1][j+1][1]%=mod;
if(i-j-1>0){
f[i+1][j][0]+=(i-1-j)*f[i][j][0];
f[i+1][j][0]%=mod;
}
if(j-1>0) {
f[i+1][j-1][0]+=f[i][j][1]*(j-1);
f[i+1][j-1][0]%=mod;
}
f[i+1][j][1]+=f[i][j][1];
f[i+1][j][1]%=mod;
f[i+1][j+1][1]+=f[i][j][1];
f[i+1][j+1][1]%=mod;
f[i+1][j][0]+=f[i][j][1]*(i-j);
f[i+1][j][0]%=mod;
}
}
printf("%lld\n",f[n][0][0]);
return 0;
}

火题大战Vol.0 B 计数DP的更多相关文章

  1. 金题大战Vol.0 C、树上的等差数列

    金题大战Vol.0 C.树上的等差数列 题目描述 给定一棵包含\(N\)个节点的无根树,节点编号\(1-N\).其中每个节点都具有一个权值,第\(i\)个节点的权值是\(A_i\). 小\(Hi\)希 ...

  2. 火题大战Vol.1 A.

    火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...

  3. 金题大战Vol.0 A、凉宫春日的叹息

    金题大战Vol.0 A.凉宫春日的叹息 题目描述 给定一个数组,将其所有子区间的和从小到大排序,求第 \(k\) 小的是多少. 输入格式 第一行两个数\(n\),$ k\(,表示数组的长度和\)k$: ...

  4. 金题大战Vol.0 B、序列

    金题大战Vol.0 B.序列 题目描述 给定两个长度为 \(n\) 的序列\(a\), \(b\). 你需要选择一个区间\([l,r]\),使得\(a_l+-+a_r>=0\)且\(b_l+-+ ...

  5. 土题大战Vol.0 A. 笨小猴 思维好题

    土题大战Vol.0 A. 笨小猴 思维好题 题目描述 驴蛋蛋有 \(2n + 1\) 张 \(4\) 星武器卡片,每张卡片上都有两个数字,第 \(i\) 张卡片上的两个数字分别是 \(A_i\) 与 ...

  6. 水题大战Vol.3 B. DP搬运工2

    水题大战Vol.3 B. DP搬运工2 题目描述 给你\(n,K\),求有多少个\(1\)到\(n\) 的排列,恰好有\(K\)个数\(i\) 满足\(a_{i-1},a_{i+1}\) 都小于\(a ...

  7. [火星补锅] 水题大战Vol.2 T2 && luogu P3623 [APIO2008]免费道路 题解

    前言: 如果我自己写的话,或许能想出来正解,但是多半会因为整不出正确性而弃掉. 解析: 这题算是对Kruskal的熟练运用吧. 要求一颗生成树.也就是说,最后的边数是确定的. 首先我们容易想到一个策略 ...

  8. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  9. [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]

    Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...

随机推荐

  1. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...

  2. vue学习(十八)使用自定义指令 为字体渲染颜色

    <div id="app"> //v-color 是自定义的 <input type="text" class="form-cont ...

  3. 我自己总结的sqlite的命令行命令集

    我自己总结的sqlite 的命令行命令 导入文本数据文件时,设置分隔符为","sql>.separator "," sql>import devic ...

  4. Django开发之Ajax 返回内容报错

    预期效果 Django通过Ajax POST提交数据,前台弹窗处理结果 粗略代码 # views.py 代码 ...省略... msg = { 'code': 200, 'message': 'Hel ...

  5. Python3.7安装pyaudio库报错问题及修复

    本人今天在使用python编写语音相关项目是需要引用pyaudio库,结果发现引用失败,刚开始报错内容如下: 说让我升级pip,然后我就按照提示升级了pip,然后又再次尝试安装pyaudio库,然后还 ...

  6. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  7. Python 变量类型及变量赋值

    在 Python 中,变量不一定占用内存变量.变量就像是对某一处内存的引用,可以通过变量访问到其所指向的内存中的值,并且可以让变量指向其他的内存.在 Python 中,变量不需要声明,但是使用变量之前 ...

  8. PHP abs() 函数

    实例 返回不同数的绝对值: <?phpecho(abs(6.7) . "<br>");echo(abs(-6.7) . "<br>" ...

  9. PHP ftp_systype() 函数

    定义和用法 ftp_systype() 函数返回 FTP 服务器的系统类型标识符. 如果成功,该函数返回系统类型.如果失败,则返回 FALSE. 语法 ftp_systype(ftp_connecti ...

  10. DOM标签属性和对象属性

    DOM元素的属性分为两种 (1)标签属性 直接写在标签上的属性 (2)对象属性 由于所有的DOM元素都是Object类型,所以我们可以通过对象的方式为DOM元素设置属性 1.标签属性 (1)设置标签属 ...