P3200 HNOI2009 有趣的數列

2022-03-04 05:57:30 字數 1845 閱讀 4683

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

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

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例#1: 

3 10

輸出樣例#1: 

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

solution:

本題zyys。

1.觀察下列幾種簡單情況:

$(1)n=1:(1,2);$

$(2)n=2:(1,2,3,4),(1,3,2,4);$

$(3)n=3:(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$一定在第乙個位置,$2n$一定在最後乙個位置,由數列的性質可以證明;

每組數列都可:增加方案數為n-1;移動上一次$2n$的位置,增加方案數為$1$;在此基礎上新增$2n-1$,可以發現$2n-1$允許插入的範圍為$n+1,n+2,...,2n-1$,由乘法原理知,總方案數為$\frac$;

2.所以本題化簡為求解模$p$剩餘系下的卡特蘭數,那麼通過卡特蘭數通項公式化簡知$c[n]=2n\times (2n-1).....\times (n+2)/n!$,易證分子是可以整除分母的,那麼統計約分後各個因子個數即可;

3.用線性篩法求出$[1,2n]$的$mindiv$(最小質因數),將分母分子分解質因數;

4.計算各質因數的冪取模相乘即可;

**:

#include#define il inline

#define ll long long

#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)>(b)?(b):(a))

using

namespace

std;

const

int n=2000005

;ll n,mod,ans,cnt,prime[n],isprime[n],minn[n],tot[n];

il ll fast(ll s,ll k)

return

ans;

}int

main()

}for(i,n+2,n<<1

) for(i,

1,n)

ll ans=1

; for(i,

1,cnt) ans=ans*fast(prime[i],tot[prime[i]])%mod;

cout

}

P3200 HNOI2009 有趣的數列

p3200 hnoi2009 有趣的數列 樣例輸入 3 10 樣例輸出 5 看樣例猜做法 大概猜一猜 觀察到答案是卡特蘭數列 接下來我們看看為什麼是這樣。首先化簡題目 對於乙個 2 n 的排列,我們要求 奇數字置上的數遞增 偶數字置上的數遞增 奇偶相鄰位置數遞增 奇怪的tip 偶奇相鄰不用遞增 首先...

HNOI2009 有趣的數列

求 1 到 2n 的全排列種類數,滿足奇數項和偶數項分別單增,任意 a a 以下為亂搞。考慮從1開始考慮每個數字怎麼填,可以看 猜 出,由於相鄰偶數項比奇數項大,所以奇數項一定要小一些,所以奇數項填的數字個數一定始終大於等於偶數項,這就是個卡特蘭數啦 問題變成求 catlan n p 由於 p 不是...

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...