传送门

文章目录

  • 题意:
  • 思路:

题意:

有nnn台电脑,你可以手动打开某个电脑,如果第i−1,i+1i-1,i+1i−1,i+1台电脑都打开了,那么第iii台电脑会自动打开。不能手动打开自动打开的电脑,问有多少种打开的方式使得所有电脑都开机。

思路:

首先考虑全都手动打开nnn台电脑有多少种方案。
从111开始,那么111右边的所有电脑都必须依次打开,方案数是C(n−1,0)C(n-1,0)C(n−1,0)。
从222开始,那么222右边的所有电脑都必须依次打开,左边的电脑可以在保证顺序的情况下任意时刻打开,方案数C(n−1,1)C(n-1,1)C(n−1,1)。
以此类推,总方案是C(n−1,0)+C(n−1,1)+...+C(n−1,n−1)=2n−1C(n-1,0)+C(n-1,1)+...+C(n-1,n-1)=2^{n-1}C(n−1,0)+C(n−1,1)+...+C(n−1,n−1)=2n−1。
再考虑电脑最终一定是一段手动开的,一个自动,一段手动,一段自动…一段手动。
那么定义f[i][j]f[i][j]f[i][j]表示第iii台电脑是手动开的,第i+1i+1i+1台电脑是自动开的,手动打开了jjj台电脑。
我们可以枚举多打开的电脑个数kkk来转移,即f[i][j]−>f[i+1+k][j+k]f[i][j]->f[i+1+k][j+k]f[i][j]−>f[i+1+k][j+k],含义是pos−>ipos->ipos−>i手动打开,i+1i+1i+1自动打开,i+2−>i+1+ki+2->i+1+ki+2−>i+1+k手动打开。
由于多开了kkk台电脑,那么按照上面结论,它有2k−12^{k-1}2k−1个打开的方法。
由于前面已经打开了jjj个了,我们可以从j+kj+kj+k个位置选kkk个位置来打开kkk个电脑,所以乘一个C(k+j,k)C(k+j,k)C(k+j,k)即可。
转移方程为:f[i+k+1][j+k]+=f[i][j]∗2k−1∗C(j+k,k)f[i+k+1][j+k]+=f[i][j]*2^{k-1}*C(j+k,k)f[i+k+1][j+k]+=f[i][j]∗2k−1∗C(j+k,k)

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=510,INF=0x3f3f3f3f;
const double eps=1e-6;int n,mod;
LL c[N][N],pow2[N];
LL f[N][N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&mod);pow2[0]=1;for(int i=1;i<N;i++) pow2[i]=pow2[i-1]*2%mod;for(int i=0;i<N;i++)for(int j=0;j<=i;j++){if(j==0) { c[i][j]=1; continue; }c[i][j]=c[i-1][j-1]+c[i-1][j]; c[i][j]%=mod;}for(int len=1;len<=n;len++){f[len][len]=pow2[len-1];for(int cnt=0;cnt<=len;cnt++)for(int k=1;k+len<=n;k++)(f[len+k+1][cnt+k]+=f[len][cnt]*c[cnt+k][k]%mod*pow2[k-1]%mod)%=mod;}LL ans=0;for(int i=0;i<=n;i++) (ans+=f[n][i])%=mod;printf("%lld\n",ans);return 0;
}
/**/

Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp相关推荐

  1. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  2. Codeforces Global Round 14 E Phoenix and Computers

    大意: 一排电脑,每次可以选择打开一台电脑,如果某一台电脑相邻的左边和右边都被打开了,它会自动打开.问打开n台电脑的方案数 思路: O(n^3)做法 不难发现,在操作过程中,一台台电脑其实就是被分成了 ...

  3. Codeforces Global Round 14, C. Phoenix and Towers

    problem C. Phoenix and Towers time limit per test2 seconds memory limit per test256 megabytes inputs ...

  4. Codeforces Global Round 1 晕阙记

    Codeforces Global Round 1 晕阙记 我做这场比赛的时候晕得要死.做这三道题做太久了,rating涨不起来啊! A 如果愿意的话你可以看做是膜2意义下的运算,写快速幂等各种膜运算 ...

  5. Codeforces Global Round 3

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

  6. Codeforces Global Round 1

    Codeforces Global Round 1 题解:The Editorial of the First Codeforces Global Round A:其实mod 2计算一下就行了 B:删 ...

  7. 【Codeforces Global Round 23】B. Rebellion

    Codeforces Global Round 23中B. Rebellion Codeforces比赛记录 文章目录 题目链接: 一.B. Rebellion 题目意思: 上思路: 总结 B. Re ...

  8. Codeforces Global Round 4-D. Prime Graph(伯特兰-切比雪夫定理)

    题目:Codeforces Global Round 4-D. Prime Graph 题意:给出n(顶点的个数),要求所得图满足: 1.无平行边和自环 2.边的总数是个质数 3.每个点的度(也就是点 ...

  9. codeforces global round 23

    constest :codeforces global round 23 contest time:2022.10.16 contest grade: 2800 contest rating chan ...

最新文章

  1. Pytorch两种模型保存方式
  2. Ubuntu 安装flash
  3. 精通python要多久-精通python 或者R语言大约需要多长时间?怎样算精通?
  4. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】
  5. sharepoint站点移植方案
  6. 万源之源之drupal7
  7. LeetCode(1103)——分糖果 II(JavaScript)
  8. ADO.NET 之 一
  9. PS教您与粗壮的胳膊拜拜
  10. Ubuntu Server Nginx 下配置 mono 下运行 asp.net mvc
  11. 译 - Cassandra 数据建模的基本规则
  12. 浙江省计算机二级办公软件高级应用技术真题,浙江省计算机二级办公软件高级应用技术考试题库.doc...
  13. 关于body.clientHeight,body.clientWidht获取的不是可视高度的问题
  14. 模拟电子技术基础第五版习题 视频讲解 模拟电子技术基础第五版答案
  15. GCode软件使用说明书
  16. huobi程序化交易项目
  17. 【VS Code】Windows10下VS Code配置Ruby语言环境
  18. 分析问题的方法论—逻辑树法则
  19. 微信小程序开发语言的选择
  20. 基于51单片机万年历

热门文章

  1. mysql丢失链接_MySQL远程连接丢失问题解决方法
  2. 直男约会能有多奇葩​?
  3. 震惊世界的亚洲8大奇迹,你都知道几个?
  4. 最诡异数学悖论:1+1=1
  5. 除了PS,原来这个也可以轻松实现图像处理!
  6. 看完这13张图,不得不佩服还是外国人会玩人工智能
  7. hive集成spark和mysql
  8. Oracle 加密配置,Oracle sqlnet设置网络传输加密
  9. c++ 与 java_Java与C++比较
  10. java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序