興味深いことに、列の数が10239をLOJ

興味深いことに、列の数が10239をLOJ

まず第一にでも作るためにスタックに応じて、それはカトレアの数である、奇数スタックとして見ることができ、実際には、プレイテーブルも見ることができ、あなたが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 }
完全なコード

 

おすすめ

転載: www.cnblogs.com/Al-Ca/p/11222893.html