我們稱乙個長度為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 #include6using
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 不是...