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      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.mzph.cn/news/373994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无限漫游

一、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…

phpcms 下载模型列表页直接点击下载

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

(转) 中断处理程序中断服务例程

关于中断处理程序和中断服务例程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;与之前不…

2014编程之美资格赛

2014 编程之美挑战赛 --- 资格赛真题 题目1 : 同构 时间限制:2000ms单点时限:1000ms内存限制:256MB描述 给定2个树A和B&#xff0c;保证A的节点个数>B的节点个数。 现在你需要对树A的边进行二染色。 一个好的染色方案&#xff0c;指不存在一个树A中的连通块&#xff0c;同时…

stand up meeting 12/11/2015

part组员今日工作工作耗时/h明日计划工作耗时/hUI冯晓云完成单词释义热度排序&#xff1b;允许用户自主添加释义&#xff1b;完成了button位置的修正&#xff08;finally&#xff09;和弹窗的美化&#xff1b; 6try the backup plan 6PDF Reader朱玉影 完成了pdf文件的打…

ssrf漏洞内网渗透_渗透技巧之SSRF

SSRF——服务端请求伪造&#xff0c;上一篇&#xff0c;我谈到了CSRF客户端请求伪造&#xff0c;这个是我们通过攻击用户&#xff0c;引诱客户点击我们伪造好的表单&#xff0c;从而达到我们攻击的目的&#xff0c;是从客户端发起的&#xff0c;那么SSRF服务端请求伪造当然是通…

Spring Insight – Web应用程序分析

您是否正在使用Spring Framework编写Web应用程序&#xff1f; 您是否曾经想过引擎盖下发生了什么&#xff1f; 为什么您的应用程序响应如此缓慢&#xff1f; 在您仍然等待应用程序响应的同时&#xff0c;为什么窗外的蜗牛如此之快地消失在远处&#xff1f; 您应该:)&#xff0c…

创建动态链接库时设置导出函数的方法

有两种方法1.使用模块定义文件, 2.在要导出的函数前加上 __declspec(dllexport) 我们用VS2008新建个DLL工程&#xff0c;工程名为“TestDLL” 把默认的源文件后缀 .CPP改为.C&#xff08;C文件&#xff09; int _stdcall MyFunction(int iVariant){return 0; } 1. 使用传统的模…

javascript的浏览器Bom详解,window、location、history对象

BOM(BrowserObjectModel)也叫浏览器对象模型&#xff0c;描述与浏览器进行交互的方法和接口。BOM由多个对象组成&#xff0c; 其中代表浏览器窗口的Window对象是BOM的顶层对象&#xff0c;其他对象都是该对象的子对象。 JavaScript由三部分组成&#xff1a;ECMAScript,BOM&…

MySQL的Master/Slave群集安装和配置

本文介绍MySQL的Master/Slave群集安装和配置&#xff0c;版本号安装最新的稳定版GA 5.6.19。 为了支持有限HA。我们用Master/Slave读写简单孤立的集群。有限HA这是当Master不可用&#xff0c;数据不会丢失。但在Master写的&#xff0c;必须手工处理故障。假设要支持更高的可用性…

动态申请二维数组

以下是动态申请a[m][n]的源代码 代码一&#xff1a; /* 编译器&#xff1a;DEV C */ #include<stdio.h> #include<stdlib.h> int main() {int **a;int i,j,m,n;scanf("%d%d",&m,&n); a (int **)malloc(sizeof(int *)*m);for (i0;i<m; i){a[i…

JavaOne正在重建动力

在JavaOne上度过了一个非常忙碌的一周&#xff0c;今年的活动有很多让人喜欢的地方。 有很多惊喜的公告&#xff0c;很多很好的内容/会议&#xff0c;并且在场地和组织上都有很多改进。 对于一直耐心等待我发表我所有演讲的人们&#xff0c;我为您的延迟表示歉意……给4个演讲一…

tensorflow http调用_《TensorFlow 内核剖析》笔记——系统架构

3 系统架构系统整体组成&#xff1a;Tensorflow的系统结构以C API为界&#xff0c;将整个系统分为前端和后端两个子系统&#xff1a;前端构造计算图后端执行计算图&#xff0c;可再细分为&#xff1a;运行时&#xff1a;提供本地模式和分布式模式计算层&#xff1a;由kernal函数…

(转)数据流图

转自:http://jingyan.baidu.com/article/4f34706eefdb04e387b56deb.html 数据流图4种图元 数据流图的实例 转载于:https://www.cnblogs.com/wrencai/p/5852389.html

MySQL中文乱码问题

项目中用到MySQL数据库时中文出现乱码问题&#xff08;中文字符都变成了&#xff1f;&#xff09;解决&#xff1a; 1、统一项目与数据库的编码&#xff0c;项目中用的是UTF-8因此我的把数据库的编码统一成UTF-8 修改方式&#xff1a;修改 MySQL根目录中的 my.ini 文件替换d…

C++实例讲解Binder通信

binder是android里面的通信机制&#xff0c;这就不说它如何如何好了&#xff0c;Goog已经说过了&#xff0c;这里不多说。binder是一个面向对象的编程方法&#xff0c;大量使用虚函数类。最近研究binder看到一网友写的&#xff0c;就借鉴一下。这个例子很好的解释里binder通信关…