bzoj1925 地精部落
神题!
地精部落
题目描述
传说很久以前,大地上居住着一种神秘的生物:地精。 地精喜欢住在连绵不绝的山脉中。具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N 之间的正 整数。 如果一段山脉比所有与它相邻的山脉都高,则这段山脉是一个山峰。位于边 缘的山脉只有一段相邻的山脉,其他都有两段(即左边和右边)。 类似地,如果一段山脉比所有它相邻的山脉都低,则这段山脉是一个山谷。 地精们有一个共同的爱好——饮酒,酒馆可以设立在山谷之中。地精的酒馆 不论白天黑夜总是人声鼎沸,地精美酒的香味可以飘到方圆数里的地方。 地精还是一种非常警觉的生物,他们在每座山峰上都可以设立瞭望台,并轮 流担当瞭望工作,以确保在第一时间得知外敌的入侵。 地精们希望这N 段山脉每段都可以修建瞭望台或酒馆的其中之一,只有满足 这个条件的整座山脉才可能有地精居住。 现在你希望知道,长度为N 的可能有地精居住的山脉有多少种。两座山脉A 和B不同当且仅当存在一个 i,使得 Ai≠Bi。由于这个数目可能很大,你只对它 除以P的余数感兴趣。
输入格式
仅含一行,两个正整数 N, P。
输出格式
仅含一行,一个非负整数,表示你所求的答案对P取余 之后的结果。
样例
样例输入
4 7
样例输出
3
数据范围与提示

对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤10910^9109
题目大意
规定一个数如果比其左边右边数都小则称之为山谷,如果都大则称之为山峰。给定1-n(1-n不重复出现)的一个数列。求使山峰山谷交替出现的数列方案数
计数dp?
引理1
如果一个序列每个数ai置换为(n-ai)+1我们可以得到一个符合题意新数列,并且若原队列先降后增,则新数列先增后降
引理2
所有先降后增的方案数之和等于先增后降方案数之和
这两个引理非常重要
由因引理二可得:如果设f[i]为长度为i的山(固定j为山峰)并且前两个山分别为山峰和山谷(先降后增)时方案数,那么我们得出最后结果f[n]只需要*2就可得ans
你可能会疑问j是什么,别着急
固定j为山峰,那么j只有为奇数时才能转移。
fi可以由每一个固定j为山峰的位置转移。
首先因为先降后增那么f偶数项末尾一定为山谷,
然后我们从i-1个数中选择j-1个数,再让他们*f[j-1],即可将他们固定为先降后增。
然后又由于引理二得到后i-j个数中先增后降其实就是先降后增方案。
$f[i]=\sum_{j为奇数}^{j<=i} f[j-1]*f[i-j]*$ $C_{i-1}^{j-1}$
转移就完了。
以下是本人(常数极大+丑陋+刻意压行)的代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 3000000
ll C[4][A],f[A],n,p;
int main(){
cin>>n>>p;f[0]=C[1][1]=C[0][0]=C[1][0]=1;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=i;j++)
{
if(j&1)
f[i]=(f[i]+f[j-1]%p*f[i-j]%p*C[(i-1)&1][j-1])%p;
C[i&1][j]=(C[(i-1)&1][j]+C[(i-1)&1][j-1])%p;
}
cout<<(2*f[n])%p<<endl;
}
bzoj1925 地精部落的更多相关文章
- BZOJ-1925 地精部落 烧脑DP+滚动数组
1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1053 Solved: 633 [Submit][Status ...
- luogu2467/bzoj1925 地精部落 (dp)
求1~n组成一个抖动序列的方案数 首先这种序列有一些非常妙妙但我发现不了的性质 1.对于一个抖动序列,如果i和i+1不相邻,则交换i和i+1,他还是个抖动序列 2.对于一个抖动序列,我把每个数拿n+1 ...
- bzoj1925地精部落——数学
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1925 真是精妙的递推式...好难想到啊: 详见这位的博客:https://www.cnblo ...
- 【BZOJ1925】[SDOI2010]地精部落(动态规划)
[BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...
- 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)
「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...
- 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP
[BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...
- [bzoj1925][Sdoi2010]地精部落_递推_动态规划
地精部落 bzoj-1925 Sdoi-2010 题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数) 注释:$1\le ...
- 【bzoj1925】地精部落[SDOI2010](dp)
题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...
- bzoj1925 [Sdoi2010] 地精部落【DP】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...
随机推荐
- Django(6)自定义路由转换器
自定义路径转换器 有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器 django内置的路径转换器源码解析 在我们自定义路由转 ...
- C++中使用sort对常见容器排序
本文主要解决以下问题 STL中sort的使用方法 使用sort对vector的排序 使用sort对map排序 使用sort对list排序 STL中sort的使用方法 C++ STL 标准库中的 sor ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧
之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...
- [bug] xshell:退格键乱码
参考 https://jingyan.baidu.com/article/77b8dc7fd52c576174eab6f6.html
- [刷题] 1 Two Sum
要求 给出一个整型数组nums 返回这个数组中两个数字的索引值i和j 使得nums[i]+nums[j]等于一个给定的target值 两个索引不能相等 实例 nums=[2,7,11,15], tar ...
- HTML的表格元素
一.HTML的表格元素 1.table元素 <table> 标签定义 HTML 表格.简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成.tr 元素定 ...
- Spring Cloud(Dalston.SR1)
Spring Cloud 示例项目地址:https://github.com/Yanshaoshuai/microservicecloud Eureka 集群搭建 microservicecloud- ...
- 基于多端口的Web服务
[Centos7.4版本] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~ ...
- win10 启用Hyper-V并安装Ubuntu20.10
本文的最终目的是要将.netcore5.0(.net5.0)部署在Ubuntu中的docker容器中. 当前环境: 主系统:win10家庭版 虚拟机:Hyper-V (win10自带虚拟机) 虚拟机系 ...
- STM32SD卡 (U盘)IAP升级
http://www.openedv.com/posts/list/65104.htm