1. 程式人生 > 其它 >Catalan數刷題小記

Catalan數刷題小記

技術標籤:數論Catalan數

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