题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794

题意概述:
  给出一个N*M的网格。网格上有一些点是障碍,不能经过。行走的方式是向右下角跳马步。求有多少种方案可以从(1,1)走到(N,M)。
  多组数据,组数不超过25。N,M<=1e18。

分析:

  还是水题。。。(我写这个的原因只是因为我第一次用lucas)分析一下可以发现横跳和纵跳各自的步数是确定的,所以变成了一个组合数问题。

  当有障碍的时候按照第一次碰到的障碍分类,先把棋盘当成完全没有障碍,然后扣掉这些方案即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int mo=;
typedef long long LL; LL N,M,R;
int inv[mo],J[mo],Ji[mo];
struct XY{
LL x,y;
friend bool operator < (XY a,XY b){
return a.x<b.x||a.x==b.x&&a.y<b.y;
}
friend bool operator == (XY a,XY b){
return a.x==b.x&&a.y==b.y;
}
}p[];
int f[]; int Lucas(LL x,LL y)
{
if(x<y) return ;
if(x<mo&&y<mo) return 1ll*J[x]*Ji[x-y]%mo*Ji[y]%mo;
return 1ll*Lucas(x/mo,y/mo)*Lucas(x%mo,y%mo)%mo;
}
void ready()
{
inv[]=;
for(int i=;i<mo;i++)
inv[i]=1ll*inv[mo%i]*(mo-mo/i)%mo;
J[]=,Ji[]=;
for(int i=;i<mo;i++){
J[i]=1ll*J[i-]*i%mo;
Ji[i]=1ll*Ji[i-]*inv[i]%mo;
}
}
int solve(LL n,LL m)
{
if((*n-m-)<||(*n-m-)%||(*m-n-)<||(*m-n-)%) return ;
LL a=(*m-n-)/,b=(*n-m-)/;
return Lucas(a+b,b);
}
int main()
{
ready();
int T=;
while(cin>>N>>M>>R){
int ans=solve(N,M);
if(R){
for(int i=;i<=R;i++)
cin>>p[i].x>>p[i].y;
sort(p+,p+R+);
R=unique(p+,p+R+)-p-;
memset(f,,sizeof(f));
for(int i=;i<=R;i++){
f[i]=solve(p[i].x,p[i].y);
for(int j=;j<i;j++)if(p[j].x<p[i].x&&p[j].y<p[i].y)
f[i]=(f[i]-1ll*f[j]*solve(p[i].x-p[j].x+,p[i].y-p[j].y+)%mo+mo)%mo;
}
for(int i=;i<=R;i++)
ans=(ans-1ll*f[i]*solve(N-p[i].x+,M-p[i].y+)%mo+mo)%mo;
}
cout<<"Case #"<<++T<<": "<<ans<<'\n';
}
return ;
}

最新文章

  1. jquery导航栏
  2. HashMap 扩容 加载因子
  3. 如何处理ABBYY中出现错误代码142和55的问题
  4. WebAPI Post类型传参报错“找不到与该请求匹配的操作”
  5. Linux下升级python
  6. LeetCode Best Time to Buy and Sell Stock 买卖股票的最佳时机 (DP)
  7. 如何用Java语言向串口读写数据
  8. The Swift Programming Language--语言指南--协议
  9. Struts2运行机制(MVC)的分析:
  10. Sql Server中COUNT(字段名)跟COUNT(*)的特殊不同点
  11. Debian/Ubuntu安装Oracle客户端TNS
  12. 玩玩微信公众号Java版之五:获取关注用户信息
  13. CentOS7配置php7.0支持redis
  14. centos7安装遇到的坑
  15. 虚拟机下 centos7 无法连接网络
  16. early_suspend【转】
  17. SpringBatch的初步了解
  18. Got fatal error 1236原因和解决方法
  19. Kali linux创建和删除用户
  20. 笔记2:MYSQL 表操作

热门文章

  1. Redis集群整合到springboot框架
  2. C++中的头文件(.h)和源文件(.cpp)都应该写什么?
  3. openresty安装配置 Ubuntu下
  4. mysql数据库和数据表的简单操作
  5. jquery获取周对应的日期
  6. Mysqldump自定义导出n条记录
  7. FastDFS轻量级分布式文件系统部署
  8. python系列7进程线程和协程
  9. C errno是否是线程安全的
  10. 【Python让生活更美好01】os与shutil模块的常用方法总结