网上找了很多人的博客,都看不太懂,还是大力学长的方法好。

  要说明的一点是,因为是比较大的数字的组合数再加上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 + 容斥)的更多相关文章

  1. 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 ...

  2. HDU 5794 A Simple Chess (Lucas + dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794 多校这题转化一下模型跟cf560E基本一样,可以先做cf上的这个题. 题目让你求一个棋子开始在( ...

  3. HDU 5794 A Simple Chess Lucas定理+dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794 题意概述: 给出一个N*M的网格.网格上有一些点是障碍,不能经过.行走的方式是向右下角跳马步.求 ...

  4. HDU 5794 - A Simple Chess

    HDU 5794 - A Simple Chess题意: 马(象棋)初始位置在(1,1), 现在要走到(n,m), 问有几种走法 棋盘上有r个障碍物, 该位置不能走, 并规定只能走右下方 数据范围: ...

  5. 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 ...

  6. HDU 5794 A Simple Chess(杨辉三角+容斥原理+Lucas定理)

    题目链接 A Simple Chess 打表发现这其实是一个杨辉三角…… 然后发现很多格子上方案数都是0 对于那写可能可以到达的点(先不考虑障碍点),我们先叫做有效的点 对于那些障碍,如果不在有效点上 ...

  7. hdu 5792(树状数组,容斥) World is Exploding

    hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...

  8. hdu_5794_A Simple Chess(lucas+dp)

    题目链接:hdu_5794_A Simple Chess 题意: 给你n,m,从(1,1)到(n,m),每次只能从左上到右下走日字路线,有k(<=100)的不能走的位置,问你有多少方案 题解: ...

  9. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. django 中间键重定向

    1,定义和注册中间件 在注册的中间件中使用: from django.http import HttpResponseRedirect '''下面的书写方法会陷入死循环,所以必须加判断条件只调用一次' ...

  2. 三主机配置 keepalived VIP高可用

    三台主机: 192.168.33.134 192.168.33.136 192.168.33.137   实验前: 关闭selinux 和iptables     1). 192.168.33.134 ...

  3. SVN主从备份

    SVN主从备份 两套环境:192.168.67.63(主SVN) 192.168.67.60(从SVN) 1.主环境上已经装好SVN并且存在数据仓库/home/svndata在从环境上,新建一/hom ...

  4. Linux(CentOS)下编译安装apache

    Centos7.6系统 已经安装lnmp一键环境 想装个apache跑php7 (php7的安装以及与apache的交互在这里: https://www.cnblogs.com/lz0925/p/11 ...

  5. Element 封印

    官方网站 https://element.eleme.cn/#/zh-CN 简介 Element 是一套为开发者.设计者和产品经理准备的基于Vue2.0的组件库,提供了配套的设计资源,帮助快速建立网站 ...

  6. Git学习笔记(1)

    一.Git特点 1.直接快照,而非比较差异 Git只关心文件数据的整体是否发生变化,而不关心具体文件及其内容发生了那些变化.也就是说Git在保存文件时,每次只会在上一次版本基础上保存那些变化的文件,为 ...

  7. 认识并初步应用GitHub——C++

    好好学习,天天向上 一.这是一个根据规定的开头 GIT的地址 https://github.com/Notexcellent GIT的用户名 Notexcxllent 学号后五位 82405 博客地址 ...

  8. 23_2spring的常用注解

    1.基于注解的IOC配置 1.1导入jar包 <?xml version="1.0" encoding="UTF-8"?> <project ...

  9. dfs序+RMQ求LCA详解

    首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...

  10. 第六章 组件 56 组件-组件中的data

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...