zoukankan      html  css  js  c++  java
  • E. Natasha, Sasha and the Prefix Sums 题解(dp+卡特兰数)

    题目链接

    题目思路

    (dp[i][j])表示由(i)(1)(j)(-1)组成的前缀和总和

    这样可以成立的原因是我们固定地认为每当新加入一个数的时候将该数插入序列的最前方,这种设定仍然保证了动

    规涵盖所有可能的排列。

    (dp[i][j]=dp[i-1][j]+C(i+j-1,i-1)+dp[i][j - 1]+(-1)*(C(i+j-1,j-1)-)最大前缀和为0

    的数列个数)​

    最大前缀和为0的数可以利用卡特兰数求出

    代码

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int maxn=4e3+5,inf=0x3f3f3f3f,mod=998244853;
    const double eps=1e-6;
    int n,m;
    ll dp[maxn][maxn];
    ll fac[maxn],finv[maxn];
    ll qpow(ll a,ll b){
        ll ans=1,base=a;
        while(b){
            if(b&1) ans=ans*base%mod;
            base=base*base%mod;
            b=b>>1;
        }
        return ans;
    }
    void init(int n){
        fac[0]=finv[0]=1;
        for(int i=1;i<=n;i++){
            fac[i]=fac[i-1]*i%mod;
        }
        finv[n]=qpow(fac[n],mod-2);
        for(int i=n-1;i>=1;i--){
            finv[i]=finv[i+1]*(i+1)%mod;
        }
    }
    ll c(ll a,ll b){
        if(a<b) return 0;
        ll ans=fac[a]*finv[b]%mod*finv[a-b]%mod;
        return ans;
    }
    int main(){
        cin>>n>>m;
        init(4000);
        for(int i=1;i<=n;i++){
            dp[i][0]=i;
            for(int j=1;j<=m;j++){
                dp[i][j]=dp[i-1][j]+c(i+j-1,i-1)+dp[i][j-1]-c(i+j-1,i);
                if(j-1>=i){
                    dp[i][j]+=c(i+j-1,i)-c(i+j-1,j);
                }
                dp[i][j]=(dp[i][j]%mod+mod)%mod;
            }
        }
        printf("%lld
    ",dp[n][m]);
        return 0;
    }
    
    
    不摆烂了,写题
  • 相关阅读:
    Android程序对不同手机屏幕分辨率自适应的方法
    用户管理和身份验证
    vue----scoped独立样式作用域
    vue----component动态组件
    css----行内元素&&块状元素
    html----rem结合vw布局
    js----jsonp原理
    js----白屏事件&&dom ready时间
    js----var a=b=2解析
    js----常见的表示false的有哪些
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15108960.html
Copyright © 2011-2022 走看看