战地
裸的卡特兰数
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; }
从0到1很难,但从1到100很容易