THUPC2019 過河卒二

2022-03-26 19:00:40 字數 1131 閱讀 8847

題目

好難啊,不會啊;啊,\(k\leq 20\),那就直接容斥吧;

我們硬點一些控制點,之後使我們必須經過這些被硬點的點;由於我們只能往右上走,所以經過這些被欽定的點的順序是一定的,我們只需要考慮相鄰兩點之間的路徑數最後乘起來就好;

於是我們需要推乙個\(f(n,m)\)表示從\((0,0)\)走到\((n,m)\)的路徑數;

如果沒有那個斜向上走直接組合數即可,有了這個斜向上走我們就列舉斜向上走了多少次,於是

\[f(n,m)=\sum_^m\binom\binom

\]\(\binom\)就是走到了\((k,k)\)這個位置之後我們只往右往上走,\(\binom\)就是把\(k\)個斜向上走插到\(n+m-2k\)步裡去;

這裡的模數特別小,於是我們lucas一下,就可以\(o(m\log_p n)\)計算\(f(n,m)\),由於\(f\)之後在兩兩關鍵點之間用到,於是直接\(o(mk^2\log_p n)\)預處理好即可;

最後我們還需要考慮從最後乙個欽定點走出邊界的情況,設\(g(n,m)\)表示起點為\((0,0)\),矩形右上角為\((n,m)\)走出邊界的方案數;

我們規定從上走出邊界的點最後都要走到\((n,m+1)\),從右走出邊界的都走到\((n+1,m)\);特殊的,還有在\((n,m)\)位置斜向上走出邊界的,於是\(g(n,m)=f(n+1,m)+f(n,m+1)+f(n,m)\)

**

#include#define re register

const int mod=59393;

struct nodep[25];

inline int dqm(int x)

inline int qm(int x)

int fac[mod],ifac[mod],inv[mod],ans[25][25],lst[25],fst[25],id[25],n,m,k;

inline int cmp(int a,int b)

inline int lucas(int n,int m)

inline int f(int n,int m)

inline int g(int n,int m)

inline int calc(int state)

int main()

過河卒演算法

過河卒基本思想 利用動態規劃轉空間為時間,利用動態規劃一般方法,把資料記錄下來,同時走兩條路線,只要不重合就好 include include include include define maxx a,b,c,d max max a,b max c,d using namespace std in...

過河卒 遞推

description 如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點 圖中的p1,p2 p8 和 c 卒不能通過對方馬的...

過河卒 題解

以前碼的 include include using namespace std long long b 21 21 int n,m,a,b void init if a 2 0 b 1 0 把馬的位置和所有馬能走到的位置都賦為0,注意考慮邊界 b a 2 b 1 0 if a 2 0 b 1 m ...