Catalan數刷題小記
阿新 • • 發佈:2021-02-07
Catalan數刷題小記
小貓
題目:P1375 小貓
題目分析: 很有趣一道題,雖然本題的本質是求
n
n
n的Catalan數,但是真的不好想到這一點。我們可以把這個環展開,左邊一隻小貓發出一根線,右邊一個小貓接受一根線,則
1
1
1~
n
n
n中接受線的小貓一定小於等於發出線的小貓,由於線不能交叉,所以對於發出線的小貓與接受線的小貓固定的數列中,只有一種排列方式。問題可由此轉化為求Catalan數
Code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1000000007;
ll Read(){
ll dx=0,fh=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
dx=dx*10+c-'0';
c=getchar();
}
return dx*fh;
}
ll n,inv[100009];
void inverse(){
inv[1]=1;
for(int i=2;i<=100008;i++) inv[i]=((p-(p/i) )%p)*inv[p%i]%p;
}
ll Catalan(ll x){
if(x==0||x==1) return 1;
ll Return=((Catalan(x-1)%p)*(inv[x+1]%p))%p*((4*x%p-2)%p)%p;
return Return;
}
int main(){
n=Read();
inverse();
printf("%lld",Catalan(n)%p);
return 0;
}
總結與反思:
1.要將題目抽象為一個數學問題
2.求Catalan需要用到的逆元為2~n+1,所以for迴圈中至少要算到n+1