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

  要说明的一点是,因为是比较大的数字的组合数再加上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. Scala学习三——数组相关操作

    一.若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer 固定长度数组: 如val nums=new Array[Int](10) //10个整型数组,所有元素初始化为0; val ...

  2. ETL测试或数据仓库测试入门

    概述 在我们学习ETL测试之前,先了解下business intelligence(即BI)和数据仓库. 什么是BI? BI(Business Intelligence)即商务智能,它是一套完整的解决 ...

  3. 修改源码去除zblog博客分类目录的RSS图标

    zblog博客的所建立的分类默认前面是有一个RSS图标的,如下图所示: 其实这个图标的存在并不能起到太大的美化作用,增加用户订阅数量的作用.那么应该如何去掉这个RSS图标呢? 这个RSS图标的生成在z ...

  4. vbs 简单文件操作

    Dim fso, MyFile, fldSet fso = CreateObject("Scripting.FileSystemObject")Set fld = fso.crea ...

  5. JS基础_运算符的优先级

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. B-Tree和 B+Tree的数据存储结构

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  7. ASP.NET数据库连接类(SqlDBHelper)

    第一步:创建一个名为SqlDBHelper的类,用来作为联通数据库和系统之间的桥梁. 第二步:引入命名空间,如果System.Configuration.System.Transcations这两个命 ...

  8. Unexpected console statement (no-console)

    在vue cli项目中用consloe.log()打印,启动项目报错 export default { name: 'app', components: { }, created() { this.t ...

  9. jdk中集成的jre和单独安装的jre有什么区别?

    jdk 和 jre 是什么? 有什么区别? jre Jre 是java runtime environment, 是java程序的运行环境.既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有 ...

  10. Samba set of user authentication and file access rights

    This series is compatible with Linux certification exam LPIC. A typical Linux user-level topics omit ...