HDU 5794 A Simple Chess ——(Lucas + 容斥)
网上找了很多人的博客,都看不太懂,还是大力学长的方法好。
要说明的一点是,因为是比较大的数字的组合数再加上mod比较小,因此用Lucas定理求组合数。
代码如下(有注释):
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <set>
#include <vector>
using namespace std;
const int mod = ;
typedef long long ll;
typedef pair<ll,ll> pii; int k;
ll fact[+],dp[+];
ll n,m;
vector<pii> V; void init()
{
fact[] = fact[] = ;
for(int i=;i<=;i++) fact[i] = fact[i-] * i % mod;
} void ex_gcd(ll a,ll b,ll &x,ll &y,ll &d)
{
if(!b) {d = a; x = ; y = ;}
else
{
ex_gcd(b,a%b,y,x,d);
y -= x * (a/b);
}
} ll qpow(ll a,ll b)
{
ll ans = ;
while(b)
{
if(b & ) ans = ans * a % mod;
a = a * a % mod;
b >>= ;
}
return ans;
} ll inv(ll t,ll p)
{
/*ll x,y,d;
ex_gcd(t,p,x,y,d);
return d==1 ? (x%mod+mod)%mod : -1;*/
return qpow(t,p-);
} int comb(int n,int m)
{
if(m< || n<m) return ;
return fact[n] * 1LL * inv(fact[m],mod) % mod * inv(fact[n-m],mod) % mod;
} ll Lucas(ll n,ll m,int p)
{
return m ? Lucas(n/p,m/p,p) * comb(n%p,m%p) % mod : ;
} ll solve(int i,int j) // j to i 的无视障碍的步数总数
{
if(V[i].second < V[j].second || V[i].first < V[i].first || (V[i].first+V[i].second-V[j].first-V[j].second)%) return -;
ll need = (V[i].first+V[i].second-V[j].first-V[j].second) / ;
// need 表示走过的步数
ll step = Lucas(need, V[i].first-V[j].first-need, mod);
// 第二个参数表示走过的两步的步数
// 总的步数(need)中选择若干步是走两步的
return step % mod;
} int main()
{
init();
int kase = ;
while(scanf("%I64d%I64d%d",&n,&m,&k)==)
{
V.clear();
for(int i=;i<=k;i++)
{
ll x,y;scanf("%I64d%I64d",&x,&y);
V.push_back(pii(x,y));
}
V.push_back(pii(,));
V.push_back(pii(n,m));
sort(V.begin(),V.end());
memset(dp,,sizeof(dp));
int sz = V.size();
for(int i=;i<sz;i++)
{
dp[i] = solve(i,);
if(dp[i] == -) dp[i] = ;
for(int j=;j<i;j++)
{
ll step = solve(i,j);
if(step != -)
{
dp[i] -= step * dp[j] % mod;
// 所有从原点到i这个点的路径中,从原点到禁止点再从该禁止点到i点的所有路径都是不被允许的,需要减掉
if(dp[i] < ) dp[i] = ((dp[i] % mod) + mod) % mod;
}
}
}
printf("Case #%d: %I64d\n",kase++,dp[sz-]);
}
}
HDU 5794 A Simple Chess ——(Lucas + 容斥)的更多相关文章
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- HDU 5794 A Simple Chess (Lucas + dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794 多校这题转化一下模型跟cf560E基本一样,可以先做cf上的这个题. 题目让你求一个棋子开始在( ...
- HDU 5794 A Simple Chess Lucas定理+dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794 题意概述: 给出一个N*M的网格.网格上有一些点是障碍,不能经过.行走的方式是向右下角跳马步.求 ...
- HDU 5794 - A Simple Chess
HDU 5794 - A Simple Chess题意: 马(象棋)初始位置在(1,1), 现在要走到(n,m), 问有几种走法 棋盘上有r个障碍物, 该位置不能走, 并规定只能走右下方 数据范围: ...
- HDU 5794 A Simple Chess dp+Lucas
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 A Simple Chess Time Limit: 2000/1000 MS (Java/O ...
- HDU 5794 A Simple Chess(杨辉三角+容斥原理+Lucas定理)
题目链接 A Simple Chess 打表发现这其实是一个杨辉三角…… 然后发现很多格子上方案数都是0 对于那写可能可以到达的点(先不考虑障碍点),我们先叫做有效的点 对于那些障碍,如果不在有效点上 ...
- hdu 5792(树状数组,容斥) World is Exploding
hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...
- hdu_5794_A Simple Chess(lucas+dp)
题目链接:hdu_5794_A Simple Chess 题意: 给你n,m,从(1,1)到(n,m),每次只能从左上到右下走日字路线,有k(<=100)的不能走的位置,问你有多少方案 题解: ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- B-Tree和 B+Tree的数据存储结构
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...
- 设计模式及UML图
UML图 1. 依赖关系
- 转:idea类名出现了不同的颜色
转:https://blog.csdn.net/yf_mood/article/details/88191818 在安装了git以后发现idea类名出现了不同的颜色,如下: 它们分别表示的含义: 绿色 ...
- 在vue-cli项目中使用bootstrap
1.安装插件 npm install jquery --save npm install bootstrap --save npm install popper.js --save 2.配置webpa ...
- 命令行工具--curl
目录 命令:curl 一.简介 二.使用案例 1.基本用法 2.保存访问的网页 3.测试网页返回值 4.指定proxy服务器以及其端口 5.cookie 6.模仿浏览器 7.伪造referer(盗链) ...
- Delphi CloseHandle函数
- 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)
开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...
- 数据总线&地址总线&控制总线
数据总线 (1) 是CPU与内存或其他器件之间的数据传送的通道. (2)数据总线的宽度决定了CPU和外界的数据传送速度. (3)每条传输线一次只能传输1位二进制数据.eg: 8根数据线一次可传送一个8 ...
- redis 的启动、关闭 判断其是否在运行中
#检查后台进程是否正在运行 ps -ef |grep redis ps aux | grep redis #检测6379端口是否在监听 netstat -lntp | grep 6379 #使用配置文 ...
- Select,poll,epoll复用
Select,poll,epoll复用 1)select模块以列表的形式接受四个参数,分别是可读对象,可写对象,产生异常的对象,和超时设置.当监控符对象发生变化时,select会返回发生变化的对象列表 ...