zoukankan      html  css  js  c++  java
  • [SCOI2010]字符串

    思路:

    设1为向(1,1)方向走,0为向(1,-1)方向走。那么题意可转化为从(0,0)走到(n+m,n-m)且不能跨过y=0的方案数。总方案数C(n+m,n),然后要减去不合法的即线路通过y=-1的。将线路与y=-1交点的左边沿着y=-1做对称操作,则最后等价于从(0,-2)走到(n+m,n-m)的方案数。因为从(0,-2)

    走到(n+m,n-m)需要向上走n-m+2次,一共要走n+m次。设向上向下各走x,y,那么x+y=n+m,x-y=n-m+2得到x=n+1,y=m-1,所以不合法的方案为C(n+m,m-1)。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int mod=20100403;
    const int N=1001;
    int n,m,ans,f[2][N][N];
    void dp(){
    //    f[n+m][n][m]=1;
        int now=0;
        f[now][n][m]=1;
        for(int i=n+m-1;~i;i--){
            now^=1;
            for(int j=0;j<=n;j++){
                for(int k=0;k<=m;k++){
                    if(j>k&&k<m) f[now][j][k]+=f[now^1][j][k+1];
                    if(j<n) f[now][j][k]+=f[now^1][j+1][k];
                    if(f[now][j][k]>=mod) f[now][j][k]-=mod;
                }
            }
        }
        printf("%d
    ",f[now][0][0]);
    }
    int main(){
        freopen("string.in","r",stdin);
        freopen("string.out","w",stdout);
        cin>>n>>m;
        if(n<m){puts("0");return 0;}
        dp();
        return 0;
    }
    10分dp
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int mod=20100403;
    const int N=1e5+5;
    int n,m,ans,f[2][N];
    void dp(){
        int now=1;
        f[0][0]=1;
        for(int i=0;i<=n;i++){
            now^=1;
            for(int j=0;j<=min(i,m);j++){
                if(i) f[now][j]+=f[now^1][j];
                if(j) f[now][j]+=f[now][j-1];
                if(f[now][j]>=mod) f[now][j]-=mod;
            }
            for(int j=0;j<=min(i,m);j++) f[now^1][j]=0;
        }
        printf("%d
    ",f[now][m]);
    }
    int main(){
        freopen("string.in","r",stdin);
        freopen("string.out","w",stdout);
        cin>>n>>m;
        if(n<m){puts("0");return 0;}
        dp();
        return 0;
    }
    30分dp
    //ans=C(n+m,n)-C(n+m,m-1){来源折线定理}
    #include<cstdio>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    const int N=2e6+5;
    const ll mod=20100403;
    int n,m;ll ans,fz[N],fm[N];
    void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
        if(!b){d=a;x=1;y=0;return ;}
        exgcd(b,a%b,d,y,x);
        y-=a/b*x;
    }
    ll inv(ll a,ll p){
        ll d,x,y;
        exgcd(a,p,d,x,y);
        return d==1?(x%p+p)%p:-1;
    }
    int main(){
        cin>>n>>m;
        int S=n+m;fz[0]=fm[0]=1;
        for(ll i=1;i<=S;i++) fz[i]=(fz[i-1]*i)%mod;
        fm[S]=inv(fz[S],mod);
        for(ll i=S-1;i;i--) fm[i]=(fm[i+1]*(i+1))%mod;
        ans=(fz[n+m]*fm[n]%mod*fm[m]%mod-fz[n+m]*fm[m-1]%mod*fm[n+1]%mod+mod)%mod;
        cout<<ans;
    } 
  • 相关阅读:
    [D3] 4. d3.max
    [D3] 3. Scaling Basics
    [D3] 2. Basics of SVG
    [PHP] find ascii code in string
    [PHP] csv to xml
    [AngularJS] angular-formly: Extending Types
    [R] Draw a wordcloud
    [AngularJS] Error: $location:nobase
    [Whole Web] [Node.js, PM2] Controlling runaway apps using pm2
    Runoob-Java-高级教程-实例-环境设置实例:3.Java 实例
  • 原文地址:https://www.cnblogs.com/shenben/p/6647547.html
Copyright © 2011-2022 走看看