有趣的數列 卡特蘭數

2022-07-29 03:15:13 字數 1346 閱讀 2257

我們稱乙個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件:

(1)它是從1到2n共2n個整數的乙個排列;

(2)所有的奇數項滿足a1

3<…2n-1,所有的偶數項滿足a2

4<…2n;

(3)任意相鄰的兩項a2i-1與a2i(1≤i≤n)滿足奇數項小於偶數項,即:a2i-1

2i。現在的任務是:對於給定的n,請求出有多少個不同的長度為2n的有趣的數列。因為最後的答案可能很大,所以只要求輸出答案 mod p的值。

input

輸入檔案只包含用空格隔開的兩個整數n和p。輸入資料保證,50%的資料滿足n≤1000,100%的資料滿足n≤1000000且p≤1000000000。

output

僅含乙個整數,表示不同的長度為2n的有趣的數列個數mod p的值。

sample input

3 10
sample output

5

對應的5個有趣的數列分別為(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6)。

hint

1.通項公式:h(n)=c(n,2n)/(n+1)=(2n)!/((n!)*(n+1)!) = c(n, 2n) - c(n +1

, 2n)

2.遞推公式:h(n)=((4*n-2)/(n+1))*h(n-1

); h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0

).3.前幾項為:h(0)=1,h(1)=1,h(2)=2,h(3)=5,h(4)=14,

#include#include

#include

#include

#include

#include

#include

#define ll long long

#define pa pair#define mod 1000000007

#define inf 100000000

using

namespace

std;

intread()

returnx;}

ll ans=1

;int

n,p,cnt;

int pri[1000005],mn[2000005],num[2000005

];bool del[2000005

];void

getpri()

}}void add(int x,intf)}

intmain()

BZOJ1485 有趣的數列 卡特蘭數

首先要明確這是卡特蘭數,證明如下 我們可以把奇數項和偶數項看成2個數列,然後從1到2 n掃一邊可以往2個數列裡塞,但必須滿足奇數項的個數時刻大於等於偶數項個數 小的話就不能讓奇數項小於偶數項了 於是便巧妙地出棧順序問題嗎即卡特蘭數。看到p不一定是素數,便想到了exlucas,打完交上去tle80,這...

卡特蘭數列

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

卡特蘭數,高精度卡特蘭數

簡單介紹 卡特蘭數是組合數學中常常出現的乙個數列。個人認為不管是遞推公式還是代表的含義都比斐波那契數列難理解一些。遞推公式 應用 1.cn表示長度2n的dyck word的個數。dyck word是乙個有n個x和n個y組成的字串。且全部的字首字串皆滿足x的個數大於等於y的個數。下面為長度為6的dyc...