Description

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

Input

仅含一行,两个正整数 N, P。

Output

仅含一行,一个非负整数,表示你所求的答案对P取余 之后的结果。

Sample Input

4 7

Sample Output

3

数据范围与提示

对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤10^9

神仙题,太神仙了

最近在做组合数学,然后一看到这道题就想去打表找规律。手模了几组小样例后发现真的是毫无规律可言,于是开始找各种性质深陷其中,未果,寻病终。

然鹅,手模万岁

最后开始找i个数和i+1个数之间的关系,不断地往上一个序列里插数,过了一会转念一想,嗯?嗯?嗯?这不dp吗

然后就往dp上面想,这题总的来说还是思考了挺长时间。

一开始我想的是f[i][j]表示[1~i]的数且首项为j的方案总数(没想到这个状态数组定义的还挺接近于正解)。

然后又开始各种找规律,又手模了半天自己也发现了一些性质,但对于状态转移没有什么用,实在是想不出来了,就颓了题解。

题解真是神仙(蒟蒻博主看什么都神仙)。

我们姑且称满足题意的序列为抖动序列

首先我们来证明一波性质:

  1. 对于一个抖动序列,若j与j+1不相邻,则交换j与j+1后的序列仍为抖动序列。证明:若j与j+1不相邻那么与j或j+1相邻的数与j或j+1的差值至少为2,那么显然交换之后此序列仍为抖动序列。
  2. 如果将一个抖动序列中所有大于等于x的元素都加1,那么此序列仍为抖动序列。证明:我们先考虑每一个波谷和其两侧的波峰,我们可以分情况讨论若此部分三个数均大于或小于x,显然成立,如果此部分波谷小于x,而波峰大于x,加一,显然成立,因为每个小部分都成立,所以总体成立。(蒟蒻博主自己瞎搞的,可能是伪证,大神觉得有问题请指正)
  3. 把一个抖动序列的每一项i都变成n-i+1,那么此序列仍为抖动序列。证明(这绝逼是伪证,博主蒟蒻,各位神犇凑或者看吧):(感受一下)其实这个定理大家想想就能想明白,就相当于如果一个数很大,那么减掉它之后就会变成一个小数,反之亦然,并且大小关系倒置。

然后就可以dp了,我们设f[i][j]为已经有i个数,且首项为j且j为波峰的方案总数。

既然确定了首项,我们在来考虑第二项,若第二项不为j-1,那么根据引理1,我们把所有这种情况下的序列都交换j与j-1的位置,交换之后的序列仍为抖动序列,那么这种情况方案数为f[i][j-1]。

我们在来考虑第二项为j-1的情况,这种情况就比较麻烦,我们去掉第一个数j后,所剩下的就只有[1~j-1]和[j+1~i],考虑把第二个区间减一那么就得到了一个[1~i-1]的抖动序列,再使j-1为波谷,

根据引理3,此种情况方案总数为f[i-1][i-1-(j-1)+1]=f[i-1][i-j+1]。

因为对称性我们把ans×2,就的到了结果。

下面是代码,用了滚动数组省空间

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define int long long
const int M=;
using namespace std;
int f[][M];
signed main(){
int n,p;
scanf("%lld%lld",&n,&p);
int now=,pre=;
f[now][]=;
for(int i=;i<=n;i++){
swap(now,pre);
for(int j=;j<=i;j++){
f[now][j]=(f[now][j-]+f[pre][i-j+])%p;
}
}
int ans=;
for(int i=;i<=n;i++){
ans=(ans+f[now][i])%p;
}
ans*=;
printf("%lld",(ans%p+p)%p);
}

地精部落

​9​​

[sdoi 2010][bzoj 1925]地精部落(神仙dp)的更多相关文章

  1. BZOJ 1925 地精部落(DP)

    一道很经典的DP题. 题意:求n排列中波动排列的种数. 不妨考虑DP,令dp1[i][j],表示1-j的排列中,第一项为i之后递增的波动排列种数.dp2[i][j]表示1-j的排列中,第一项为i之后递 ...

  2. [SDOI2010][BZOJ 1925]地精部落

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  3. bzoj 1925 地精部落

    Written with StackEdit. Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 \(N\) 的山脉 \(H ...

  4. BZOJ 1925地精部落题解

    题目链接 一道神仙题,有很多思考的方式,这里选择最好理解的一种来讲 我们将序列分为两种,一种开头递增,一种开头递减,显然这两种序列的数目是一样的 现在我们只用考虑开头递增的情况 f[i][j]表示前i ...

  5. BZOJ-1925 地精部落 烧脑DP+滚动数组

    1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1053 Solved: 633 [Submit][Status ...

  6. 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP

    [BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...

  7. bzoj1925 [Sdoi2010] 地精部落【DP】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...

  8. bzoj 1925 [Sdoi2010]地精部落(DP)

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  9. bzoj 1925: [Sdoi2010]地精部落【dp】

    设[f[i][j]为1到i,开头数字是j并且是山峰的方案数 注意到当数字j和j-1不相邻时,交换它们会得到一个新的符合要求的序列,所以f[i][j]+=f[i][j-1]; 如果相邻,那么j是山峰,j ...

随机推荐

  1. LKM rootkit:Reptile学习

    简介 Reptile是github上一个很火的linux lkm rootkit,最近学习了一些linux rootkit的内容,在这里记录一下. 主要是分析reptile的实现 Reptile的使用 ...

  2. type(),dir(),getattr(),hasattr(), isinstance()用法

    1.type(变量)  --->输出变量的类型int.float.str or others: 2.dir()   ----> dir() 函数不带参数时,返回当前范围内的变量.方法和定义 ...

  3. NHiberante的优缺点

    参考 NHiberante的优缺点 3.1 优点 (1).面向对象:NHiberante的使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想. (2).透明持久化:带有持 ...

  4. Sublime Text3 插件收录

    收录常用的Sublime Text3 插件, 方便安装使用,免得每次一个个的搜, 欢迎补充 安装方法直接打开install package 搜索安装 1. Babel 支持react jsx语法 2. ...

  5. [转载]Pytorch中nn.Linear module的理解

    [转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...

  6. 基于MQTT的串口数据转发器

    问: ComHub能做什么?ComHub使用MQTT协议,将串口数据经TCP分发出去.这种结构可以实现很多功能:1.COM-Over-TCP: 将COM数据使用TCP远程传送;2.COM多播:一个CO ...

  7. collections:内建模块,提供额外的集合类

    介绍 collections里面包含了很多除了内置类型之外的数据类型,我们使用它们有时可以很方便的完成一系列操作 ChainMap:搜索多个字典 from collections import Cha ...

  8. 简单粗暴 每个servlet之前都插入一段代码解决 乱码问题

    response.setHeader("content-type", "text/html;charset=UTF-8"); response.setChara ...

  9. 给Eclipse安装MinGW

    @2019-06-30 [小记] 安装完Eclipse后Toolchains只有Cross GCC,下载安装MinGW后添加系统环境变量即可

  10. python常用模块:标准文件及模块练习

    1.请写出规范目录 并解释各文件夹的作用 bin 执行文件core 核心业务逻辑conf 配置文件lib 库.公共代码.第三方模块db 数据分析log 日志文件readme 文本文档 2.改造atm+ ...