战地

 


 裸的卡特兰数

 

dfs暴搜

#include<stdio.h> 
long long k,tot,n;

void dfs(int dep) 
{
    if(dep==2*n) {
        if(!k) tot++; //恰好满足 
        return ;
    }
    if(k) {
        k--;
        dfs(dep+1);
        k++;
    }
    k++;
    dfs(dep+1);
    k--;
}

int main() 
{
    scanf("%lld",&n);
    dfs(0);
    printf("%lld",tot);
    return 0;
} 

 

 

递推 

#include<stdio.h> 
const int P=1e9+7;
int n;
long long f[110][110];

int main() 
{
    scanf("%d",&n);
    for(int i=0;i<=n;++i) {
        for(int j=0;j<=i;++j) {
            if(j) f[i][j]=(f[i-1][j]+f[i][j-1])%P;
            else f[i][j]=1;
        }
    }
    printf("%lld",f[n][n]);
    return 0;
}

 

 

公式 

#include<stdio.h> 
const int P=1e9+7;
int n;
long long f[110][110];

int main() 
{
    scanf("%d",&n);
    for(int i=0;i<=n;++i) {
        for(int j=0;j<=i;++j) {
            if(j) f[i][j]=(f[i-1][j]+f[i][j-1])%P;
            else f[i][j]=1;
        }
    }
    printf("%lld",f[n][n]);
    return 0;
}

 

 

std正解+ksm

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std ;
const int mod=1e9+7;
int n,T;

long long ksm(long long a,long long b){
    long long ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;b>>=1;
    }
    return ans;
}

long long init(){
    long long ret1=1,ret2=1;
    for(int i=2;i<=n;i++)
        ret1=1ll*ret1*(n+i)%mod,
        ret2=1ll*ret2*i%mod;
    return 1ll*ret1*ksm(ret2,mod-2)%mod;
}

int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        printf("%lld\n",init());
    }
    return 0;
}

 

posted @ 2018-08-28 22:40  qseer  阅读(115)  评论(0编辑  收藏  举报