Description

Flowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种,
圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗
粒的序列,如果存在1<=i

Data Constraint

对于30%的数据,满足n<=10,m<=10
对于60%的数据,满足n<=300,m<=300
对于100%的数据,满足1<=n<=3000,1<=m<=3000,2<=p<=1000000007

Solution

我们先讲讲60分的解法。设f[i][j][k]表示前i位的偶数位中还有j个圆粒,k个皱粒没有匹配。那么转移就很显然了。
那么我们现在想想满分:我们将奇数位与偶数位分开。显然1号位和2*m号位不可能匹配,我们将他们去掉,最后在答案上*4即可。为了保证原本不能匹配的奇数位也能匹配,我们在偶数位前人为加多n位,里面事先放入0~n个圆粒,其余为皱粒,即f[0][i]=1。若奇数位不能匹配就找它。那么现在我们设f[i][j]表示奇数位枚举至i,偶数位枚举至n+i,偶数位还有j个圆粒没有匹配,因为奇数位的i个都是匹配的,所以偶数位中只有n+i-i个豌豆没有匹配,又其中有j个圆粒,那自然有n-j个皱粒。那么现在f[i][j][k]就变为f[i][j][n-j]了,转移不变。但我们发现这样的计算会算重。即加入的n个偶数位中假如有a个圆粒,b个皱粒,其余的偶数位缺c个圆粒,d个皱粒。那么现在只要a>=c,b>=d答案就会计算一遍,这显然不行。所以我们强制a=c,b>=d时才会计算,即在某一时刻该数组会经历f[i][0]的情况,为了实现这个,我们多加入一位f[i][j][0..1]表示数组是否经历f[i][0],最后答案就为∑ni=0f[m][i][1]\sum_{i=0}^nf[m][i][1]。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=3e3+5;
int f[maxn][maxn][2];
int n,m,mo,i,t,j,k,l,x,y,z,ans;
int main(){freopen("friend.in","r",stdin);freopen("friend.out","w",stdout);scanf("%d%d%d",&n,&m,&mo);n--;m--;for (i=1;i<=n;i++)f[0][i][0]=1;f[0][0][1]=1;for (i=0;i<m;i++)for (j=0;j<=n;j++){f[i+1][j][0]=(f[i+1][j][0]+f[i][j][0]*2%mo)%mo;f[i+1][j+1][0]=(f[i+1][j+1][0]+f[i][j][0])%mo;f[i+1][j][1]=(f[i+1][j][1]+f[i][j][1]*2%mo)%mo;f[i+1][j+1][1]=(f[i+1][j+1][1]+f[i][j][1])%mo;if (j){f[i+1][j-1][1]=(f[i+1][j-1][1]+f[i][j][1])%mo;if (j!=1) f[i+1][j-1][0]=(f[i+1][j-1][0]+f[i][j][0])%mo;else f[i+1][0][1]=(f[i+1][0][1]+f[i][j][0])%mo;}}for (i=0;i<=n;i++)ans=(ans+f[m][i][1])%mo;ans=ans*2%mo*2%mo;printf("%d\n",ans);
}

【JZOJ5411】【NOIP2017提高A组集训10.22】友谊相关推荐

  1. JZOJ5411. 【NOIP2017提高A组集训10.22】友谊 DP

    DescriptionFlowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种, 圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗 粒的序列,如果存在1& ...

  2. JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输

    Description 城市中有一条长度为n的道路,每隔1的长度有一个公交车站,编号从0到n,学校在0号车站的位置.其中每个公交车站(除了n号车站)有两个属性ci和vi,代表从这个公交车站出发的公交车 ...

  3. JZOJ 5414. 【NOIP2017提高A组集训10.22】幸运值

    Description 校庆志愿者小Z在休息时间和同学们玩卡牌游戏.一共有n张卡牌,每张卡牌上有一个数Ai,每次可以从中选出k张卡牌.一种选取方案的幸运值为这k张卡牌上数的异或和.小Z想知道所有选取方 ...

  4. 【JZOJ 5410】【NOIP2017提高A组集训10.22】小型耀斑

    Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...

  5. jzoj5410【NOIP2017提高A组集训10.22】小型耀斑

    题目 Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会 ...

  6. 【JZOJ5410】【NOIP2017提高A组集训10.22】小型耀斑

    Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...

  7. JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑

    Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...

  8. [JZOJ5410]【NOIP2017提高A组集训10.22】小型耀斑 (口胡)

    Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...

  9. 【NOIP2017提高A组集训10.22】友谊

    Description Flowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种, 圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗 粒的序列,如果存在1 ...

最新文章

  1. 强烈推荐Bulletproof Ajax 中文版
  2. 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
  3. 组织在召唤:如何免费获取一个js.org的二级域名
  4. mongoose populate 返回 指定 字段
  5. 计算机辅助功能包括什么,CAD软件是什么?有什么功能?
  6. STM32“隐藏的定时器”-DWT
  7. MFC开发- string、const char*、 char* 、char[]相互转换(全)
  8. 高净值人群依靠什么可以挣那么多钱?
  9. String的startWith()和endWith()
  10. stm32单片机的智能交通灯设计
  11. php绘制频谱图,频谱党神功入门篇《教你怎么看频响图》——我们的理想是让hifi不再神秘!...
  12. 向量图svg转jpg、png不清晰问题
  13. 远程服务器如何共享电脑文件共享,远程控制实现文件共享 -电脑资料
  14. 带你实现完整的视频弹幕系统
  15. YY/T 0316风险管理对医疗器械得应用学习分享(一)
  16. Mikrotik RouterOS路由器和华为交换机链路聚合+VRRP+单线多拨
  17. 阿里IOT用AMQP在服务端订阅消息,踩坑
  18. 涂鸦,Canvas绘图
  19. 安装了向日葵或TeamViewer导致系统亮度无法调节
  20. Arduino——超声波测距

热门文章

  1. 最全双11红包抢购攻略:错过了再等一年
  2. flex布局,最后的一个元素布满剩余空间
  3. [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git...
  4. Swiper插件的安装及使用
  5. 赚钱 36 计 - 第二计:资源计
  6. 剑问天下java_Java并发编程精讲
  7. 【玩转Atlas200DK系列】Atlas 200 DK安装python的hiai库以及opencv
  8. 19、《每周一点canvas动画》——桌球运动(1)
  9. ML Visual利器解决深度学习模型图
  10. call的用法及底层实现