HDU 5794:A Simple Chess(Lucas + DP)

題目鏈接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794

題意:讓一個棋子從(1,1)走到(n,m),要求像馬一樣走日字型并只能往右下角走。里面還有r個障礙點不能經過或者到達,問有多少種走法可以走到(n,m)。

思路:畫個圖可以發現走的點像一個斜著的楊輝三角。所以可以得到一個從點 i 走到點 j 的路徑數是一個組合數。?

大概就是長這樣,楊輝三角的每個點的數如下。

1

1???????1

1??????2??????1

1???????3??????3??????1

1??????4???????6??????4??????1

1???????5??????10??????10??????5??????1

1??????6??????15??????20??????15??????6??????1

1??????7??????21??????35??????35??????21??????7??????1

?

找到規律:路徑數為C(在這一步的位置,走過的步數)。走過的步數是當前的點 i 坐標(x,y),(x+y)/3就是步數了。當前的位置是min(x,y)-步數。這里的步數就相當于三角的層數。

首先對全部障礙從小到大進行排序,對于每個障礙 i,求出從(1,1)走到其的路徑總數,減去之前的障礙(0 <= j < i)可以走到現在的障礙的路徑總數(dp[i] -= dp[j] * 從點 j 走到點 i 的路徑數)。組合數的計算要用到Lucas定理進行計算。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <string>
  5 #include <cmath>
  6 #include <iostream>
  7 #include <stack>
  8 using namespace std;
  9 #define MOD 110119
 10 typedef long long LL;
 11 struct node
 12 {
 13     LL x, y;
 14 }p[115];
 15 LL dp[115];
 16 LL f[MOD+10];
 17 /*
 18 dp[i]一開始表示從(0, 0)走到第i個點的路徑數
 19 后面要減去如果前面有障礙,那么會有一部分路徑是不能走的
 20 減去的路徑數為分別為第j個點(0<=j<i)走到第i個點的路徑數*dp[j]
 21 */
 22 
 23 bool cmp(const node &a, const node &b)
 24 {
 25     if(a.x == b.x) return a.y < b.y;
 26     return a.x < b.x;
 27 }
 28 
 29 void biao() //打出階乘表
 30 {
 31     f[0] = f[1] = 1;
 32     for(int i = 2; i <= MOD; i++) {
 33         f[i] = f[i-1] * i % MOD;
 34     }
 35 }
 36 
 37 LL quick_pow(LL a, LL b)
 38 {
 39     a %= MOD, b %= MOD;
 40     LL ans = 1;
 41     while(b) {
 42         if(b & 1) ans = ans * a % MOD;
 43         a = a * a % MOD;
 44         b >>= 1;
 45     }
 46     return ans;
 47 }
 48 
 49 LL C(LL n, LL m)
 50 {
 51     if(m > n) return 0;
 52     if(m < 0) return 0;
 53     LL ans = 1;
 54     ans = ans * f[n] % MOD * quick_pow(f[m] * f[n-m] % MOD, MOD - 2) % MOD;
 55     return ans;
 56 }
 57 
 58 LL Lucas(LL n, LL m)
 59 {
 60     if(m == 0) return 1;
 61     return C(n % MOD, m % MOD) % MOD * Lucas(n / MOD, m / MOD) % MOD;
 62 }
 63 
 64 int main()
 65 {
 66     LL n, m, r;
 67     int cas = 0;
 68     biao();
 69     while(~scanf("%I64d%I64d%I64d", &n, &m, &r)) {
 70         memset(dp, 0, sizeof(dp));
 71         bool flag = 0;
 72         for(int i = 0; i < r; i++) {
 73             scanf("%I64d%I64d", &p[i].x, &p[i].y);
 74             if(p[i].x == n && p[i].y == m) flag = 1;
 75             p[i].x--, p[i].y--;
 76         }
 77         sort(p, p + r, cmp);
 78         p[r].x = n - 1, p[r].y = m - 1; //把目標點加入
 79         printf("Case #%d: ", ++cas);
 80         if(flag || (p[r].x + p[r].y) % 3 != 0) { //如果障礙在目標點上或者不能走到目標點
 81             puts("0"); continue;
 82         }
 83         for(int i = 0; i <= r; i++) {
 84             if((p[i].x + p[i].y) % 3 == 0) { //如果這個障礙是可以走到的
 85                 LL a = (p[i].x + p[i].y) / 3; //第幾層
 86                 LL b = min(p[i].x, p[i].y) - a; //位置
 87                 dp[i] = Lucas(a, b); //類似于楊輝三角的組合數
 88                 for(int j = 0; j < i; j++) {
 89                     if(p[j].y >= p[i].y || p[j].x >= p[i].x) continue; //題目要求只能往右下角走
 90                     LL xx = (p[i].x - p[j].x);
 91                     LL yy = (p[i].y - p[j].y);
 92                     if((xx + yy) % 3 == 0) { //要能夠從j點走到i點
 93                         LL aa = (xx + yy) / 3;
 94                         LL bb = min(xx, yy) - aa; //減去可以從j點走到i點的路徑數
 95                         dp[i] -= (Lucas(aa, bb) * dp[j]) % MOD;
 96                         dp[i] = (dp[i] + MOD) % MOD;
 97                     }
 98                 }
 99             }
100         }
101         printf("%I64d\n", dp[r]);
102     }
103     return 0;
104 }

?

轉載于:https://www.cnblogs.com/fightfordream/p/5827815.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php源碼分析之PHPAPI宏的作用

在PHP源碼中&#xff0c;我們經常會看到很多函數前面有個PHPAPI&#xff0c;但這是什么呢&#xff1f; 于是我在php源碼/main/php.h中找到了它的定義 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # …

15分鐘內開始使用Amazon Web Services和全自動資源調配

在等待一個新項目時&#xff0c;我想學習一些有用的東西。 而且由于在許多項目中我們需要評估和測試正在開發的應用程序的性能&#xff0c;而很少有足夠的硬件來生成實際負載&#xff0c;因此我決定學習更多有關按需在云中按需配置虛擬機的知識&#xff0c;即Amazon Web Servic…

解析JVM內存區域組成

在方法&#xff08;代碼塊&#xff09;中定義一個變量時&#xff0c;java就在棧中為這個變量分配JVM內存空間&#xff0c;當超過變量的作用域后&#xff0c;java會自動釋放掉為該變量所分配的JVM內存空間&#xff1b;而在堆中分配的JVM內存由java虛擬機的自動垃圾回收器來管理。…

python打開瀏覽器后帶cookie_Python爬蟲使用瀏覽器的cookies:browsercookie

很多用Python的人可能都寫過網絡爬蟲&#xff0c;自動化獲取網絡數據確實是一件令人愉悅的事情&#xff0c;而Python很好的幫助我們達到這種愉悅。然而&#xff0c;爬蟲經常要碰到各種登錄、驗證的阻撓&#xff0c;讓人灰心喪氣(網站&#xff1a;天天碰到各種各樣的爬蟲抓我們網…

VS插件開發

參考資料: VS插件開發 - 個性化VS IDE編輯器 自己動手編寫一個VS插件&#xff08;一&#xff09; VS Addin插件基本開發入門 VS Addin插件配置、部署 轉載于:https://www.cnblogs.com/wangwangfei/p/5830081.html

使用AspectJ,Javassist和Java Proxy進行代碼注入的實用介紹

靜態地或在運行時將代碼片段注入已編譯的類和方法中的功能可能會很有幫助。 這尤其適用于在沒有源代碼的第三方庫中或在無法使用調試器或探查器的環境中對問題進行故障排除。 代碼注入對于處理涉及整個應用程序的問題&#xff08;例如性能監視&#xff09;也很有用。 以這種方式…

Java中的變量

java類的成員變量有兩種&#xff1a;一種是被static關鍵字修飾的變量&#xff0c;叫類變量或者靜態變量&#xff1b;另一種沒有static修飾&#xff0c;為實例變量。 在語法定義上的區別&#xff1a;靜態變量前要加static關鍵字&#xff0c;而實例變量前則不加。 在程序運行時的…

無限漫游

一、FAT AP架構下&#xff0c;AP設備不做認證時&#xff1a; (1) AP1&#xff0c;AP2正常工作&#xff0c;發送Beacon幀&#xff0c;向STA通告支持的無線服務&#xff1b; (2) STA搜索到AP1的信號&#xff0c;向AP1發Probe Request,請求獲取AP1所提供的無線服務&#xff1b;AP…

uni-app內置地圖軌跡_MIUI11 新增親情守護,支持安全圍欄、運動軌跡功能

點擊右上角關注我們&#xff0c;每天給您帶來最新最潮的科技資訊&#xff0c;讓您足不出戶也知道科技圈大事&#xff01;日前&#xff0c;小米 MIUI 體驗總負責人 MIUI小凡 在微博上為大家預告了 MIUI11 的新特性「親情守護」&#xff0c;并表示「在親情守護中&#xff0c;我們…

:before與:after偽類的應用

1.小三角樣式 .tip{ position:relative; display:inline-block; width:100px; margin:100px; padding:30px 20px; color:#fff; border:1px solid #666; border-radius:5px; background-color:rgba(0,153,51,1);}.tip:before{ content:; posit…

小心重載API方法

重載方法是API設計中的重要概念&#xff0c;尤其是當您的API是流利的API或DSL&#xff08; 特定于域的語言 &#xff09;時。 對于jOOQ就是這種情況&#xff0c;在這種情況下&#xff0c;您經常想使用與完全相同的方法名稱來與庫進行各種交互。 示例&#xff1a;jOOQ條件 pac…

phpcms 下載模型列表頁直接點擊下載

下載模型設置本地下載 列表頁模板直接調用 <article class"prjDown"><p class"prjDownTitle">方案下載</p><nav class"prjDownNav"><ul>{pc:content action"lists" catid"$catid" num"3…

為什么Java中類方法不能訪問實例方法

我們已經知道類體中的方法分為實例方法和類方法兩種&#xff0c;用static修飾的是類方法。二者有什么區別呢&#xff1f;當一個類創建了一個對象后&#xff0c;這個對象就可以調用該類的方法。 當類的字節碼文件被加載到內存時&#xff0c;類的實例方法不會被分配入口地址&…

python展開 c函數中的宏預處理_C中的預處理宏

C中的預處理宏宏定義就屬于預處理命令的一種。那么&#xff0c;什么是宏呢&#xff1f;宏&#xff1a;c語言標準允許在程序中用一個標識符來表示一個字符串。標識符就是宏名。宏替換&#xff1a;宏替換就是宏定義。在編譯預處理中&#xff0c;將程序中所有的宏名用相應的字符串…

(轉) 中斷處理程序中斷服務例程

關于中斷處理程序和中斷服務例程ISR的區別及聯系&#xff0c;之前一直搞混&#xff0c;今天抽時間將兩者關系弄弄清楚。ok,下面進入主題。首先中斷處理程序(Interrupt Handler)和中斷服務例程ISR(Inerrupt Service Routine)是兩個不同的概念.簡單來說就是&#xff0c;一條中斷線…

使用SQL:2003 MERGE語句的奧術魔術

時不時地&#xff0c;由于以下任何原因&#xff0c;我們不得不將INSERT與UPDATE區分開來感到尷尬&#xff1a; 我們必須至少發表兩個聲明 我們必須考慮性能 我們必須考慮比賽條件 我們必須在[UPDATE; 如果UPDATE_COUNT 0 THEN INSERT]和[INSERT; 如果例外然后更新] 我們必…

Swing 學習小記

初學Swing一路問題&#xff0c;一路學習 問題一&#xff1a;JPanel中動態組件添加&#xff0c;刷新問題&#xff1f; 錯誤一&#xff1a;使用repaint()方法&#xff0c;以為可以刷新&#xff0c;可行不通。 錯誤繼續發生&#xff1a;還是使用repaint()方法&#xff0c;與之前不…

leetcode Spiral Matrix

題目連接 https://leetcode.com/problems/spiral-matrix/ Spiral Matrix Description Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [   [ 1, 2, 3 ],   [ 4, 5…

python學生類出不來中文_Python 這類看起來學習門檻低的語言,是否真的適合入門編程學習?...

Python(計算機程序設計語言)Python是一種跨平臺的計算機程序設計語言。 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。最初被設計用于編寫自動化腳本(shell)&#xff0c;隨著版本的不斷更新和語言新功能的添加&#xff0c;越多被用于獨立的、大型項目的開…

克隆可序列化和不可序列化的Java對象

開發人員經常依靠3d方庫來避免重新發明輪子&#xff0c;尤其是在Java世界中&#xff0c;Apache和Spring這樣的項目如此盛行。 在處理這些框架時&#xff0c;我們通常很少或根本無法控制其類的行為。 這有時會導致問題。 例如&#xff0c;如果您想深度克隆不提供合適克隆方法的對…