题目链接

点我跳转

题目大意

给定 \(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. HTTP常用请求头大揭秘

    本文为<三万长文50+趣图带你领悟web编程的内功心法>第四个章节. 4.HTTP常用请求头大揭秘 上面列出了报文的各种请求头.响应头.状态码,是不是感到特别晕呢.这节我们就专门挑一些最常 ...

  2. 一文了解python的 @property

    参考自: https://www.programiz.com/python-programming/property Python为我们提供了一个内置装饰器@property,此方法使得getter和 ...

  3. 【知识点】 gcc和g++的联系和区别

    目前(2020-09)GCC 编译器已经更新至 10.2版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ . 除此之外,当下的 GCC 编译器还支持编译 Go.O ...

  4. 基于云原生DevOps服务自动化部署前端项目学习总结

    本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...

  5. 关于PHP的表单数组提交显示

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <meta chars ...

  6. ZooKeeper 的选举机制,你了解多少?

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  7. asp.net core 实现支持自定义 Content-Type

    asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...

  8. C语言知识汇总,史上最全面总结,没有之一

    C语言基础 C语言学习路线 C语言入门笔记 初识C语言 简单的C程序示例 我们编写的C代码是怎样跑起来的? 简单示例,VS2019调试C语言程序 C语言基础-数据类型 深入理解变量,变量的声明,定义, ...

  9. android分析之智能指针

    智能指针是一个包装类,该类有一个指针指向真正的类对象 引用计数型智能指针,该引用计数是在应该被真正类所持有,而非包装类(智能指针) 为了方便,会将引用计数单独实现在一个类中,这样所有继承它的类都有计数 ...

  10. 一个名叫Sentinel-Rules-SDK的组件,使得Sentinel的流控&熔断规则的配置更加方便

    原文链接:一个名叫Sentinel-Rules-SDK的组件,使得Sentinel的流控&熔断规则的配置更加方便 1 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越 ...