C 挖坑 卡特蘭數列(mod998244353

2022-05-27 17:45:13 字數 2353 閱讀 2663

description

quasrain 和 fz 是好朋友。quasrain 善於挖坑而 fz 善於填坑。

這個遊戲一共會持續 2n 天。在每一天都會有人挖坑或者填坑,並在本子上記錄下「a」表示這天挖了坑,「b」表示填了坑。填坑必須填乙個現存的還沒有被填過的坑。

作為素質優秀的熊孩子,他們保證在最後一天結束的時候一定會恰好填平所有坑。

問本子上可能有多少種不同的 ab 序列

input

第一行乙個數 t 表示資料組數(t<=100000)

之後 t 行每行乙個數 n,意義如題面所示(1<=n<=1000)

output

對於每組資料輸出方案數,對 998244353 取模

sample input31

23sample output12

5hint

對於第三組樣例:

可能的 ab 序列分別為:,,,,

題目意思就是求在後面的填坑數要大於前面的挖坑次序可能情況,我們可以把填坑看成入棧操作,挖坑看成出棧操作,即填坑的累計個數不小於挖坑的排列有多少種,標準的卡特蘭數列;

什麼是卡特蘭數列:

特蘭數是乙個常用在計數情況中使用的一種特殊的數列,其分析如下:

分析:假設我們要求的出棧數為n,要得到的出棧序列為f(n),我們知道,因為入棧的順序是確定的,假設入棧順序記為1、2、3、4、5...n,那麼假設最後出棧的那個數為第k個數,那麼我們要求f(k)時,k-1個數已經先完成進棧出棧,此時有f(k-1)種方式,然後k之後的n-k個數也完成進棧和出棧,也就是f(n-k)種方式,最後第k個數出棧,此時的f(k)=f(k-1)*f(n-k),而每個數都可能是最後出棧,可以得到通式:

其遞推公式的通解(f(0)=1):

1:f(n)=c(2n,n)/n+1

2:f(n)=c(2n,n)-c(2n,n+1)))

3:f(n)=f(n-1)(4n-2)/(i+1);

坑點:由於我只知道第乙個和第三個式子,存在除法取餘,比賽的時候不會寫逆元

另外記錄一些取模公式:

a + b) % mod = (a % mod + b % mod) % mod  (1)

(a - b) % mod= (a % mod - b % mod) % mod    (2)

(a * b) % mod = (a % mod * b % mod) % mod(3)

a ^ b %  mod = ((a % mod)^b) % mod             (4)

((a*b) % mod * c)% mod = (a * (b*c) % mod) % mod            (6)

(a * b) % mod = (b * a) % mod (8)

((a +b)% mod * c) % mod = ((a * c) % mod + (b * c) % mod) % mod (9)

(這裡b^(mod-2)就是b的逆元)

#includeusing namespace std;

const int n=1e3;

const int mod=998244353;

typedef long long ll;

ll qpow(ll m,ll q)

return ans;

}ll inv[n+5];

ll getinv(ll n)

int main()

ll t,n;

cin>>t;

while(t--)

{cin>>n;

cout

#include#include#include#include#define ll long long int

#define n 1005

#define mod 998244353

using namespace std;

ll dp[n][n];

int main()

{// freopen("e:c++.txt","w",stdout);

memset(dp,0,sizeof(dp));

for(int i=0; i<=1000; i++)

dp[i][0]=1;//當挖坑的數量為零時,數量為1

for(int i=1; i<=1000; i++)

for(int j=1; j<=i; j++)

dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;//dp[i][j]的方案數為填掉上乙個的數量dp[i-1][j]和挖乙個填乙個的數量dp[i][j-1];

int t,n;

cin>>t;

while(t--)

{cin>>n;

cout卡特蘭數詳細證明過程請參考:

卡特蘭數列

由於最近怒刷筆試題遇到了很多關於卡特蘭數列的問題於是寫這篇文章,算是做個筆記吧。1卡特蘭數列的定義 是組合數學中乙個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁 查理 卡塔蘭 1814 1894 命名。2卡特蘭樹列的前幾項 1,2,5,14,42,132,429,1430,4862,16...

卡特蘭數列(Catalan)

卡特蘭數列是組合數學中乙個常出現在各種計數問題 現的數列,其前幾項為 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,卡特蘭數首先是由尤拉在計算對凸 n 邊形的不同的對角三角形剖分的個數問題時得到的,即在乙個凸 n 邊形中,通過不相交於 n 邊形...

卡特蘭數列 Catalan

卡特蘭數列 catalan 簡述卡特蘭數又稱卡塔蘭數,它是組合數學中乙個常出現在各種計數問題 現的數列,其前幾項為 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,公式1.遞迴公式1 2.遞迴公式2 3.組合公式1 4.組合公式2 5.增長趨勢 ...