P1976 鸡蛋饼(卡特兰数)
思路:显然是圆连弦问题,答案为卡特兰数,因为 ,可以用费马小定理求逆元或者用递推公式推出都可以。
AC代码:(费马小定理)
#include<bits/stdc++.h>
using namespace std;
const int mod=1e8+7;
typedef long long ll;
ll ksm(ll a,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
int main(){
int n;
scanf("%d",&n);
ll a=1,b=1;
for(int i=2;i<=n;i++) a=a*(i+n)%mod,b=b*i%mod;
printf("%lld\n",a*ksm(b,mod-2)%mod);
return 0;
}
AC代码:递推公式
#include<bits/stdc++.h>
using namespace std;
const int mod=1e8+7;
typedef long long ll;
ll h[3000]={1,1,2};
int main(){
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
for(int j=0;j<i;j++)
h[i]=(h[i]+h[j]*h[i-1-j]%mod)%mod;
printf("%lld\n",h[n]%mod);
return 0;
}