まず第一にでも作るためにスタックに応じて、それはカトレアの数である、奇数スタックとして見ることができ、実際には、プレイテーブルも見ることができ、あなたがDPを使用することができますが?
問題を解決することの難しさがここにはありませんが、pは素数ではないので、反転元を使用していませんが、サブプライム因子分解の使用が必要である後のポイントの上位50%が、パスカルの三角形+標準を取得するために使用することができます。
式によってカトレア番号:$ H [N] = \ $後FRAC {C_ {2N} ^ n}は{N + 1}、その分解を簡素化し、無分解Iは結果T、品質係数に従って開始します、品質係数の分解が少し速くなります。
1件の 空隙追加(int型のx、int型NU) 2 { 3 のための(int型 I = 1 ;プライム[I] *プライム[I] <= xと; iは++は) 4 ながら(X%のプライム[I] == 0 ) 5 { 6 CNT [プライム[I] + = NU。 7 X / = プライム[I]。 8 } 9 CNT [X] + = NU。 10 } 11 のための(int型 I = N + 2、iが= < 2 * N; iが++)(私を追加1 )。 12 のために(int型 I = 2 ; iが<= N; iが++)(私を-追加1 )。 13 LL ANS = 1 。 14 のために(int型 I = 2 ; iが= < 2 ; * N I ++ ) 15 のための(INT J = 1 ; J <= CNT [i]は、J ++ ) 16 ANS = ANS * I%のP。
1の#include <iostreamの> 2の#include <cstdioを> 3 の#define LL長い長い 4 // の#define INTのLL 5 使って 名前空間STD。 6 INTのN、P。 7 int型 CNT [ 2000010 ]。 8 INTプライム[ 20010 ]、NUM。 9 ブール isprime [ 20010 ]。 10個 の#define N 20000の 11 空隙S() 12 { 13 のために(INT I = 2; iが<= N;)は、i ++はisprimeを[I] = 1 。 14 のためには、(int型 I = 2 ; = iが<Nを; iは++ ) 15 { 16 であれば(isprime [I])プライム[++ NUM] = I。 17 のための(int型 J = 1 ; jは<= NUM && iが素数[j]を* <= N; J ++ ) 18 { 19 isprime [iが素数* [J] = 0 ; 20 もし(I%、プライム[j]が!)ブレーク。 21 } 22 } 23 } 24 空隙追加(INT X、INT NU) 25 { 26 のために(int型 I = 1 ;プライム[I] *プライム[I] <= xで、iは++ ) 27 一方(X%のプライム[I] == 0 ) 28 { 29 CNT [プライム[I] ] + = NU。 30 X / = プライム[I]。 31 } 32 CNT [X] + = NU。 33 } 34は、 メイン()符号付き 35 { 36 )(複数可。 37 CIN >> N >> P。 38 のために(int型 I = N + 2、I <=2 * N; i)は、(私の追加++ 1 )。 39 のために(int型 I = 2 ; iが<= N; iが++)(私を-追加1 )。 40 LL ANS = 1 。 41 のために(int型 I = 2 ; iが= < 2 ; * N I ++ ) 42 のための(INT J = 1 ; J <= CNT [i]は、J ++ ) 43 ANS = ANS * I%のP。 44 COUT << ANS << ENDL。 45 }