我們稱乙個長度為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 #include2view codeusing
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()
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 滿足奇數...