BZOJ 1485 有趣的數列

2022-03-26 00:30:30 字數 1701 閱讀 2428

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

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

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

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

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

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

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

3 10

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)。

【題解思路】

模擬合法括號序列,可知要求卡特蘭數。

1 #include2

using

namespace

std;

3#define ll long long

4#define ull unsigned long long

5#define rep(k,i,j) for(int k = i;k <= j; ++k)

6#define for(k,i,j) for(int k = i;k >= j; --k)

7 inline int

read()

10while(ch>='

0'&&ch<='9')

11return x*f;

12}

13const

int mxn = 2e6+5;14

intn,p;

15 inline void

file()

19/*

20thought1

211.線性篩篩出所有1~n之間的質數並用桶計數

222.對n+2~2*n進行質因數分解對應數量減少

23複雜度太高,比遞推複雜度都要高

24thought2

251.處理出從1~2*n的所有質數,對質因子從小到大標號

262.處理出從1到當前數為止的質數的個數,

27tot[x]表示從1~x內質數的標號到了tot[x]個,從1~x有tot[x]個質數

283.利用同樣的質數,下標不變,進行桶的計數。

29*/

30int

cnt[mxn],tot[mxn];

31 inline void

in()

35int

prime[mxn];

36bool

v[mxn];

37int m = 0

;38 inline void

getpri()

46for(int j = 1;j<=m && prime[j]*i<=2*n; j++)51}

52}53 inline void prewor(int x,int

num) 58}

59 ll ans = 1

;60 inline void

wor()

66 inline void

print()

6970

intmain()

view code

BZOJ1485 有趣的數列 卡特蘭數

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

1485 HNOI2009 有趣的數列

題目鏈結 題目大意 稱乙個長度為2n 的數列是有趣的,當且僅當該數列滿足以下三個條件 它是乙個1 2n的排列a1 n 1,a2 n a2 i 1i 題解 丟題解跑qaq 我的收穫 2333 include using namespace std define maxn 3000005 int n,p...

BZOJ 1485 HNOI2009 有趣的數列

bzoj 1485 hnoi2009 有趣的數列 卡特蘭數 我們稱乙個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件 1 它是從1到2n共2n個整數的乙個排列 2 所有的奇數項滿足a1 3 2n 1,所有的偶數項滿足a2 4 2n 3 任意相鄰的兩項a2i 1與a2i 1 i n 滿足奇數...