本当に、唯一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フラグ= 0。int型、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、INT&Y){ 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 }