有 2n只小猫站成一圈,主人小明想把它们两两之间用绳子绑住尾巴连在一起。同时小明是个完美主义者,不容许看到有两根绳子交叉。请问小明有几种连线方案,可以把让所有小猫两两配对? 方案数很大,仅需输出方案数模 1000000007 (一个质数)的值。 输入输出格式 输入格式: 输入一个整数 nn 输出格式: 输出方案数对 1000000007 取模的值 输入输出样例 输入样例#1: 3 输出样例#1: 5 说明 数据范围 对于60%的数据 N≤100 对于100%的数据 N≤100000
经观察可得,这是卡特兰数
但是数据太大,又让取模,所以要用到逆元
then,
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const ll mod=1e9+7; 5 ll n; 6 ll h[1000000]; 7 ll ksm(ll x,ll y) 8 { 9 ll ans=1; 10 while(y) 11 { 12 if(y&1) ans=ans*x%mod; 13 y>>=1; 14 x=x*x%mod; 15 } 16 return ans%mod; 17 } 18 int main() 19 { 20 scanf("%d",&n); 21 h[1]=1; 22 for(ll i=2;i<=n;++i) 23 // h[i]=h[i-1]*(4*i-2)/(i+1); 24 h[i]=h[i-1]*(4*i-2)%mod*ksm(i+1,mod-2)%mod; 25 printf("%lld",h[n]); 26 return 0; 27 }