题目链接

点我跳转

题目大意

给定 \(N\) 台电脑,起初每台电脑都是关闭的

现在你可以随意打开电脑,但如果第 \(i-1\)、第 \(i+1\) 台电脑是开启的,则第 \(i\) 台电脑也会自动开启,而你无法手动开启它

问你有多少种打开电脑的方法,使得最后所有电脑都是开着的

解题思路

分成两步来解决.

第一步:

考虑:如果 \(N\) 台电脑我都要手动开启,有多少种方法?

可以枚举是从哪台电脑开始打开:

  • 从 \(1\) 开始,剩下的 \(N-1\) 必须按照 \(2,3,...,n\) 的顺序开(不理解可以画一下)
  • 从 \(2\) 开始,对于 \(2\) 左边的电脑 \([3\)~\(N]\),\(4\) 必须在 \(3\) 开了之后开,\(5\) 必须在 \(4\) 开了之后开 \(...\) ,而 \(1\) 可以在任意时刻开机
  • \(...\)
  • 从 \(k\) 开始开,对于 \(k\) 左边的电脑, 它们的相对开机顺序必须是 \(k + 1 , k + 2 , ... , n\)

    对于\(k\) 右边的电脑,它们的相对开机顺序必须是 \(k-1,k-2,...,1\)

    不过左右两边的开机顺序是可以穿插在一起的

所以手动开启 \(N\) 台电脑的方案数为 \(C_{n-1}^{1}+C_{n-1}^{2}+\ldots +C_{n-1}^{n-1} = 2^{n-1}\)

第二步:

考虑:最后电脑开启的状态?

显然最后电脑开启的状态会是这样的:

手动开启 \(1\sim X_1\) → 自动开启 \(X_1+1\) → 手动开启 \(X_1+2\sim X2\) 台 →自动开启 \(X_2+1\) → \(...\) → 手动开启 \(X_{n-1} + 1\sim X_n\) ,其中需要保证 \(X_i + 1 < N\)

于是我们可以定义 \(f[i][j]\) 表示:前 \(i\) 台电脑,手动打开 \(j\) 台, 第 \(i\) 台是手动打开 ,

第 \(i + 1\) 台是自动打开的方案数

那么 \(f[i][j]\) → \(f[i + 1 + K][j + X_i]\) 的意义为:

手动打开 \(pos \sim i\) → 自动打开\(i+1\) → 手动打开 \(i + 2 \sim X_i\) 的过程

  • \(f[i+1+X_i][j+X_i]\) 相对 \(f[i][j]\) 又多手动开启了 \(X_i\) 台电脑
  • 这 \(X_i\) 台的电脑的开启方案数有 \(2^{Xi-1}\)种(第一步得出的结论
  • 然后考虑将这 \(X_i\) 台"新"电脑开机的顺序和 \(j\) 台"旧"电脑开机的顺序合并。

    即现在有 \(X_i+j\) 个开机顺序需要确认,我们可以从中选 \(X_i\) 个放"新"电脑的开机顺序,剩下的放"旧"电脑的开机顺序,那么方案数为 \(C_{X_i+j}^{X_i}\) (或者 \(C_{X_i+j}^{j}\)也可以)

所以可得: \(f[i + 1 + X_i][j + X_i] = f[i][j] \times 2^{Xi-1} \times C[j + X_i][X_i]\)

答案即: $ans=\sum ^{n}_{i=0}f\left[ n\right] \left[ i\right] $

\(i\)、\(j\)、\(X_i\) 都可以通过枚举得到

写题解不易,如有帮助到您请点个赞给予我一点小小的鼓励!

AC_Code

#include<bits/stdc++.h>
using namespace std;
const int N = 4e2 + 10;
long long C[N][N] , bit[N];
long long n , m , ans , f[N][N];
void init(int mod)
{
bit[0] = 1;
for(int i = 1 ; i <= N - 10 ; i ++) bit[i] = bit[i - 1] * 2 % mod;
for(int i = 0 ; i <= N - 10 ; i ++)
{
C[i][0] = 1;
for(int j = 1 ; j <= i ; j ++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
}
signed main()
{
cin >> n >> m;
init(m);
for(int i = 1 ; i <= n ; i ++)
{
f[i][i] = bit[i - 1];
for(int j = 0 ; j <= i ; j ++)
{
for(int k = 1 ; k + i + 1 <= n; k ++)
{
f[i + 1 + k][j + k] += f[i][j] * bit[k - 1] % m * C[j + k][k] % m;
f[i + 1 + k][j + k] %= m;
}
}
}
for(int i = 0 ; i <= n ; i ++) ans += f[n][i] , ans %= m;
cout << ans << '\n';
return 0;
}

Codeforces Global Round 14 E. Phoenix and Computers的更多相关文章

  1. [Codeforces Global Round 14]

    打挺差的. 不过\(C,D\)一眼秒了,大概是对这几个月努力的一个结果? \(B\)玄学错误挂了两发. 脑子痛然后打到一半就去睡觉了. -------------------------------- ...

  2. CodeForces Global Round 1

    CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...

  3. Codeforces Global Round 1 - D. Jongmah(动态规划)

    Problem   Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...

  4. Codeforces Beta Round #14 (Div. 2)

    Codeforces Beta Round #14 (Div. 2) http://codeforces.com/contest/14 A 找最大最小的行列值即可 #include<bits/s ...

  5. Codeforces Global Round 2 题解

    Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...

  6. Codeforces Global Round 1 (A-E题解)

    Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...

  7. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  8. Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)

    Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...

  9. 【手抖康复训练1 】Codeforces Global Round 6

    [手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思 ...

随机推荐

  1. dpi dp px 换算关系

    getResources().getDisplayMetrics().densityDpi 就是屏幕密度.getResources().getDisplayMetrics().density 也可以理 ...

  2. 用于功率集成电路应用的600伏、10安、4H-SIC横向单沟道金属氧化物半导体场效应晶体管的演示和分析

    用于功率集成电路应用的600伏.10安.4H-碳化硅横向单沟道金属氧化物半导体场效应晶体管的演示和分析 摘要: 本文报道了一个具有大电流处理能力(10 A)的600伏4H-碳化硅横向场效应晶体管的演示 ...

  3. three.js cannon.js物理引擎之齿轮动画

    郭先生今天继续说一说cannon.js物理引擎,并用之前已经学习过的知识实现一个小动画,知识点包括ConvexPolyhedron多边形.Shape几何体.Body刚体.HingeConstraint ...

  4. .net Core 上传文件详解

    .net core 和.net framework上传文件有很多需要注意的地方 .net framework 上传文件用httppostedfilebase .net core 上传文件用 IForm ...

  5. Java的特性和优势以及不同版本的分类,jdk,jre,jvm的联系与区别,javadoc的生成

    Java 1.Java的特性和优势 Write Once,Run Anywhere 简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性 2.Java的三大版本 JavaSE:标 ...

  6. layui数据表格-通过点击按钮使数据表格中的字段值增加

    通过点击右侧相对应的操作按钮,对迟到.休假次数实现自增效果 jsp页面代码 //监听行工具事件 table.on('tool(test)', function(obj){ var data = obj ...

  7. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  8. MyEclipse安装过程

    1.安装JDK并配置环境变量 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/index.html ①点击download ...

  9. 认清 React 的useState逻辑

    useState运行过程解析 function App() { const [n, setN] = useState(0); //使用 myUseState() return ( <div> ...

  10. 【linux】驱动-5-驱动框架分层分离&实战

    目录 前言 5. 分离分层 5.1 回顾-设备驱动实现 5.2 分离分层 5.3 设备 5.4 驱动 5.5 系统,模块 5.6 Makefile 参考: 前言 5. 分离分层 本章节记录实现LED驱 ...