BZOJ 1485 HNOI2009 有趣的數列

2022-04-30 04:33:10 字數 1171 閱讀 1273

bzoj_1485_[hnoi2009]有趣的數列_卡特蘭數

我們稱乙個長度為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的值。

輸入檔案只包含用空格隔開的兩個整數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)。

發現答案就是卡特蘭數的第n項,推導如下:

1~2n中的每個數,如果i這個數放到了新序列的奇數項就往右走一步,如果放到了偶數項就往上走一步。

要求中間的任何時候選的奇數項的個數都大於等於偶數項的個數,走的方案數就是卡特蘭數。

catalan[n]=c[2n][n]/n+1  模數不是質數比較難辦。

考慮建乙個質數表,把分子的質因子都加進去,再把分母的質因子減去,然後掃一遍數表即可。

時間複雜度o(n/lnn*logn)

**:

#include #include #include #include using namespace std;

#define n 2000050

typedef long long ll;

int n,p,c[n],prime[n],vis[n],cnt;

void init()

for(j=1;j<=cnt&&i*prime[j]<=2*n;j++)

} }}ll qp(ll x,ll y)

return re;

}int main()

} ll ans=1;

for(i=1;i<=cnt;i++)

printf("%lld\n",ans);

}

bzoj1485 HNOI2009 有趣的數列

思路 首先限制數很多,逐步來考慮,限制一很容易滿足,考慮限制二,也就是讓奇數字和偶數字上的數遞增,限制三就是讓奇數字上的數小於奇數字加一對應的偶數字上的數,那麼我們可以把形成序列的過程看成加數的過程,從小到大逐步加 這顯然滿足限制一 然後加數的條件一是從小到大依次放奇數字或偶數字,因此也滿足限制二,...

BZOJ1485 HNOI2009 有趣的數列

題解 考慮按順序從小到大,加入數字,將加入奇數字置看作入棧,加入偶數字置看作出棧。為什麼可以?考慮我們要保證相鄰奇數小於偶數,所以必須先填上乙個奇數的位置才能填偶數的位置,既時刻保證奇數 偶數,最終奇數等於偶數。觀察到這個性質,我們應該聯想到卡特蘭數了,套用公式求解。本題模數可能為合數,不一定存在逆...

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...