概述
题目链接
卡特兰数经典模型
A
n
s
=
2
∗
h
[
n
−
1
]
Ans = 2*h[n-1]
Ans=2∗h[n−1]
h
[
n
]
=
C
2
n
n
n
+
1
h[n] = frac{C_{2n}^{n}}{n+1}
h[n]=n+1C2nn
故只需要求一个组合数。
因为
m
o
d
mod
mod很小,而
n
n
n很大。
上一个卢卡斯定理即可。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod = 10007;
const int A = 1e4 + 10;
int fac[A],Inv[A];
int fast_pow(int n,int m){
int res = 1;
while(m){
if(m&1) res = 1LL*res*n%mod;
n = 1LL*n*n%mod;
m >>= 1;
}
return res;
}
void init(){
fac[0] = 1;
for(int i=1 ;i<A ;i++){
fac[i] = fac[i-1]*i%mod;
}
Inv[mod-1] = fast_pow(fac[mod-1],mod-2);
for(int i=mod-2 ;i>=0 ;i--){
Inv[i] = Inv[i+1]*(i+1)%mod;
}
}
int comb(int n,int m){
if(m<0 || m>n) return 0;
return fac[n]*Inv[m]%mod*Inv[n-m]%mod;
}
int Lucas(int n,int m){
return m?Lucas(n/mod,m/mod)*comb(n%mod,m%mod)%mod:1;
}
int main(){
init();
int n;
scanf("%d",&n);n--;
int ans = Lucas(2*n,n)*2%mod;
int m = (n+1)%mod;
m = fast_pow(m,mod-2);
ans = ans*m%mod;
if(ans<0) ans+=mod;
printf("%dn",ans);
return 0;
}
最后
以上就是美好手套为你收集整理的51Nod 1120 卡特兰数+卢卡斯定理的全部内容,希望文章能够帮你解决51Nod 1120 卡特兰数+卢卡斯定理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复