有趣的數列

2022-05-08 06:12:12 字數 1190 閱讀 9639

我們稱乙個長度為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->n數列中每個數字於奇數字置還是偶數字置確定了時,這個數列就確定了,因為奇數字置要求遞增,偶數字置要求遞增

所有選擇是c(2n,n)

但有時是不符合的,比如1(奇),2(偶),3(偶),4(奇),5(偶),6(奇)

其實就是掃瞄1-n的序列,放於奇數字置的數的數量總是大於等於放於偶數字置的數的數量

這樣就能保證後面更大一些的數,放於偶數字置的數的數量總是大於等於放於奇數字置的數的數量,這樣就能滿足第三條

就是卡特蘭數

但是n是1e6的,這個遞推逆元就要寫高精,但是可以用唯一分解定理,在乘或者除乙個數時,只用把他的所有質因數的指數加或者減

當然肯定是看題解的.....

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

long

ll;8

const ll maxn=3e6+7;9

ll n,p,num,ans;

10ll pri[maxn],d[maxn],cnt[maxn];

11bool

isp[maxn];

12void

gettable()20}

21}22void

add(ll x,ll val)

27 }//

cnt是最小質因數在質數表中的編號

28int

main()

37else

if(cnt[i]<0)40

} 41 cout42 }

Jzoj 1353 有趣的數列

我們稱乙個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件 1 它是從1到2n共2n個整數的乙個排列 2 所有的奇數項滿足a1打表求出前10項,可以發現就是求得卡特蘭數,可以把p pp分解質因子,然後把分子分母中的含p pp的質因子提取出來,再求解即可 include define n 20...

組合數學 有趣的數列

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

HNOI2009 有趣的數列

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