HZOJ 20190722訪問(組み合わせ数学+数論)

本当に、唯一10ptsがあった、試験T2は、試験と呼ばれるの$ O(N ^ 3)は、DPの暴力、アイデアや良いと思ったが、また多くの詳細を$、その後、スクロールのアレイは、タイトルと間違って空ではありませんが、血まみれのレッスン。

ソリューション:

実際には、データ範囲を見て、モジュラスが素数である与え、実際には、これは数学の問題であることを推測することができるはずです(ただし、式ああをプッシュしていません)

我々は慎重に問題を分析し、我々は$を設定里、ル、アップ、ダウン$それぞれ、左上に起工ステップ数は権利である、とステップの合計数は、ステップ数が、あなたが得ることができ、他の方向に行くことに限り、私たちが知っているように、その後、Tでありますしかし、我々は一人では、彼の思考の中に、その後、私たちが求めていないされた、私たちはその後、$アップ+ダウン= k個の$、$ K $のために行くために垂直方向のステップ数を設定し、その後、彼は最終的に行かなければなりません$(n、m)は$に、ステップ数を引いステップ数が$ M $、すなわち$アップダウン=メートルの$に下るまで行くので、我々はルの同じトークンRI $と$ $ $を見つけることができますすなわち、関係は、同じ2つの方程式は、我々はすべての方向に行くためのステップ数を取得するには、$ K $を列挙することができるように、その表現の組み合わせの数を一覧表示することができます。

$の\和\ limits_ {K = M} ^ {KN} C_T ^ K * C_k ^ {\ FRAC {離れ} {2}} * C_ {NK} ^ {\ FRAC {TKN} {2}} $

この問題は、ここで終了するようだが、我々は彼を法$ P $必ずしも素数ではありませんので、我々は、通常のルーカスを使うには出てこない求めている、とex_lucasは、書き込みと遅い実行するには余りにも困難なことに気づいた、実際には私にはないので、何もそれを行う方法を、私たちはデータの彼の範囲を見て、我々は最初に通常のルーカスと、このプロパティを使用することができ、回数品質係数のモジュラスP分解の各素因数が1であることを特徴とします素因数のそれぞれに対する答えは、CRTと合併することの答えを、決定しました。

注意すべきポイント:各品質係数の階乗のテーブルのために答えを求めているか、あなたがないとき、再びそれに対処しなければなりません

              特にも、時間がかかる、または非常に簡単に崩壊しないように、金型を取るようにしてください

       $ K、K + = 2を列挙型にするには、$彼垂直または水平方向の変化量はなさそうです

 

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <アルゴリズム>
 4の#include <cmath>
 5の#include <CStringの>
 6の#include <ベクトル>
 7の#include <キュー>
 8  の#define INT長い長い
 9  使用 名前空間はstd;
10  のconst  int型 N = 305 11  のintフラグ= 0int型、T、N、M。
12  int型DP [N] [N] [N]。
13  INTプライム[N]、[N]、INV [ 100005 ]、RES [N]。
14 int型の FAC [ 100005 ]。
15  のint(qpow int型int型 B、int型の{P)
 16      INT ANS = 1 17      一方、(B){
 18          であれば(B&1)ANS = ANS *%のP。
19          B >> = 1 20          = *%のP。
21      }
 22      リターン ANS%のP。
23  }
 24  INT C(INT nは、整数 M、INT P){
25      であれば(N <M)戻り 0 ;
26      他に 戻り、FAC [N]%のP *はqpow(FAC [NM] * FAC [M]%のP、P 2、P)%のPと、
27  }
 28人 のintルーカス(int型int型 B、int型p)を{
 29      であれば(B!)リターン 1 30       戻りルーカス(A / P、B / P、P)%のP *はC(%のP、Bの%のP、P)%のP。 
31  }
 32  空隙分割(int型P){
 33      のためにINT I = 2; iは++; iが= SQRT(P)< ){
 34          であれば(P%以下のI == 0 ){
 35              フラグ++ 36              プライム[フラグ] = I。
37              P / = I。
38          }
 39      }
 40      であれば(P> 1)プライム[++フラグ] = P。
41  }
 42  INT exgcd(INT A、int型 B、INT&X、INTY){
 43      のint T。
44      であれば(!B){
 45         X = 1、Y = 0返します46      }
 47      T = exgcd(B、%のB、X、Y)。
48      のT =のX。
49      X = Y。
50      、Y = TA / b *表Y。
51  }
 52  int型のCRT(){
 53      INT ANS = 0 54      INT M = 1 55      のためにint型 I = 1 M * =;私は=フラグ<I ++)はプライム[I]。
56      のためにINT I = 1;私は=フラグ<; iは++ ){
 57          歳=(年+ M /プライム[I] *無【と】%のMの*のqpow(M /プライム【と】プライム[I] - 2、プライム[i])と%のM)%M。
58      }
 59      リターン歳;
60  }
 61  INTのinit(INT P){
 62      INTミネソタ州=分(P- 1 、T);
63      FAC [ 0 ] = 1 64      のためにint型 i = 1 ; iが=ミネソタを<; Iは++ ){
 65          FAC [i]は、FAC [I-= 1 ] *%及びP。
66      }
 67 }
 68  {main()の符号付き
 69      のint P。
70      のscanf(" %LLD%LLD%LLD%LLD "、&​​T&P、およびN、&M)。
71      、M = ABS(M); N = ABS(N)
72      分割(P)。
73      であれば(T <= 100 ){
 74          INT DD = 105 75          DP [ 0 ] [DD] [DD] = 1 76          のためにint型 I = 1 ; I <= T; iが++ ){
 77              のためにINT J = -tあり、j <= T; J ++ ){
78                  のためのint型 K = -t; <= T Kあり、k ++ ){
 79                      、DP [I]、[J + DD] [K + DD] =(DP [I] [J + 1 DD] [K + DD] + DP [I- 1 ] [j + 1 + DD] [K + DD] + DP [I- 1 ] [J + DD] [K + 1 + DD] + DP [I- 1 ] [J- 1 + DD] [K + DD] + DP [I- 1 ] [J + DD] [K- 1 + DD])%のP。
80                  }
 81              }
 82          }
 83          のprintf(" %のLLD "、DP [T] [N + DD] [M + DD])。
84          リターン 0 ;
85     }
 86      INT ANS = 0 87      FAC [ 0 ] = 1 88      // (I = 1をint型、iが= 100005を<; I ++の)のためのFAC [i]は= FAC [I-1] * I%Pは、
89      のためには、int型 i = 1 ; iは=フラグ<I ++は{)
 90          INIT(プライム[i])とします。
91          のためのint型 K = N; K <= TM; K + = 2){ // I + = 2つの
92              RES [i]は=(RES [i]が+ルーカス(T、K、プライム[I])*ルーカス(K (KN)/ 2、プライム[I])%のP *はルーカス(TK、(TMK)/ 2、プライム[I]))%のP。
93          }
94      }
 95      のprintf(" %のLLD "、CRT()%のP)。
96 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/leom10/p/11228647.html