• bzoj1925 地精部落


    神题!

    地精部落

    内存限制:128 MiB 时间限制:1000 ms 标准输入输出
     
     

    题目描述

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

    输入格式

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

    输出格式

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

    样例

    样例输入

    4 7

    样例输出

    3

    数据范围与提示

    image
    对于 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;
    }
    View Code
    我已没有下降的余地
  • 相关阅读:
    让flask在出现语法错误时仍然自动重启
    ubuntu配置zsh和oh-my-zsh
    docker运行python3.6+flask小记
    vscode python3 配置生成任务
    从flask视角理解angular(四)Route
    从flask视角理解angular(三)ORM VS Service
    从flask视角理解angular(二)Blueprint VS Component
    从flask视角学习angular(一)整体对比
    Linux高级变量
    linux系统中查看日志及系统信息
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11137588.html
Copyright © 2020-2023  润新知