UVALive 6916 Punching Robot dp
Punching Robot
题目连接:
Description
In this problem, you are given a grid map of N ×M (N rows and M
columns) where the rows are numbered 1. . . N from top to bottom,
and the columns are numbered 1. . . M from left to right. Your task
is to count in how many ways you can reach cell (N, M) from cell
(1, 1) given that you are only allowed to move right or downward
at any time, i.e. if your current location is at cell (r, c), then you
can only move to cell (r + 1, c) or (r, c + 1). However, we quickly
realized that this kind of problem could be too easy for you, thus,
not challenging. Therefore, we decided to put K punching robots
in the map. Each punching robot is able to punch any object which
lies in any of 3×3 cells centered at the robot (Figure 1). To simplify
the problem, you may assume that the punching areas of any robot
do not overlap.
Your (new) task is: count in how many ways you can reach cell (N, M) from cell (1, 1) without
being punched by any robot, given that you are only allowed to move right or downward at any time.
As the output can be very large, you need to modulo the output by 997. For example, consider the
following map of 4 x 10 with two punching robots at (3, 3) and (2, 8).
Figure 2.
In this example, there are 4 ways to reach (4, 10) from (1, 1) without being punched by any of the
robots. All those 4 paths only differ when they go from (1, 5) to (4, 6):
• . . . , (1, 5), (1, 6), (2, 6), (3, 6), (4, 6), . . .
• . . . , (1, 5), (2, 5), (2, 6), (3, 6), (4, 6), . . .
• . . . , (1, 5), (2, 5), (3, 5), (3, 6), (4, 6), . . .
• . . . , (1, 5), (2, 5), (3, 5), (4, 5), (4, 6),
Meanwhile, there is only one unique path from (1, 1) to (1, 5) and from (4, 6) to (4, 10).
Input
The first line of input contains an integer T (T ≤ 100) denoting the number of cases. Each case begins
with three integers: N, M, and K (2 ≤ N, M ≤ 1, 000, 000; 0 ≤ K ≤ 10) denoting the size of the map
and the number of punching robots respectively. The following K lines, each contains two integers: Ri
and Ci (1 < Ri < N; 1 < Ci < M) denoting the position of i-th robot (row and column respectively)
in the map. You are guaranteed that, for any two robots, the row difference or the column difference
will be at least 3, i.e. no two robots’ punching areas are overlapping. You are also guaranteed that cell
(1, 1) and cell (N, M) are not in punching areas of any robots.
Output
For each case, output ‘Case #X: Y ’, where X is the case number starts from 1 and Y is the answer
for that case modulo by 997.
Explanation for 2nd sample case:
The following figure represents the map for the 2nd sample
case.
As you can see, there is no way you can reach (3, 5) from (1,
- without being punched by the robot.
Sample Input
4
4 10 2
3 3
2 8
3 5 1
2 3
5 5 0
10 9 3
9 3
6 8
3 4
Sample Output
Case #1: 4
Case #2: 0
Case #3: 70
Case #4: 648
Hint
题意
给你个(n,m)的方格,里面有一些坏的3*3位置,问你从(1,1)到(n,m)的方案数是多少
题解:
我们把3*3的拆成9个坏点,那么这道题就和CF的某道题一样了
http://www.cnblogs.com/qscqesze/p/4669136.html
但是这道题的模数是997,所以取逆元的时候可能有问题,你需要把997单独拿出来讨论一下就好了。
代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 3000005
#define mod 997
typedef long long ll;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int cas=0;
struct Point
{
long long x,y;
}points[maxn];
bool cmp(Point a,Point b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
ll p=mod;
ll fac[maxn],num[maxn];
ll qpow(ll a,ll b)
{
ll ans=1;a%=mod;
for(ll i=b;i;i>>=1,a=a*a%mod)
if(i&1)ans=ans*a%mod;
return ans;
}
ll C(ll n,ll m)
{
if(m>n||m<0)return 0;
if(num[n]!=num[n-m]+num[m]) return 0;
ll s1=fac[n],s2=fac[n-m]*fac[m]%mod;
return s1*qpow(s2,mod-2)%mod;
}
ll f[maxn];
int main()
{
fac[0]=1;
for(int i=1;i<maxn;i++)
{
if(i%997!=0)
fac[i]=fac[i-1]*i%mod,num[i]=num[i-1];
else
{
num[i]=num[i-1];
int tmp=i;
while(tmp%997==0)
num[i]++,tmp/=997;
fac[i]=fac[i-1]*tmp;
}
}
int t;scanf("%d",&t);
while(t--){
int n=read(),m=read(),k=read();
for(int i=1;i<=k;i++)
{
points[i*9-8].x=read();
points[i*9-8].y=read();
points[i*9-8].x-=1;
points[i*9-8].y-=1;
points[i*9-7].x=points[i*9-8].x-1;
points[i*9-7].y=points[i*9-8].y-1;
points[i*9-6].x=points[i*9-8].x;
points[i*9-6].y=points[i*9-8].y-1;
points[i*9-5].x=points[i*9-8].x+1;
points[i*9-5].y=points[i*9-8].y-1;
points[i*9-4].x=points[i*9-8].x-1;
points[i*9-4].y=points[i*9-8].y;
points[i*9-3].x=points[i*9-8].x+1;
points[i*9-3].y=points[i*9-8].y;
points[i*9-2].x=points[i*9-8].x-1;
points[i*9-2].y=points[i*9-8].y+1;
points[i*9-1].x=points[i*9-8].x;
points[i*9-1].y=points[i*9-8].y+1;
points[i*9].x=points[i*9-8].x+1;
points[i*9].y=points[i*9-8].y+1;
}
k*=9;
points[++k].x=n-1;
points[k].y=m-1;
sort(points+1,points+k+1,cmp);
for(int i=1;i<=k;i++)
{
f[i]=C(points[i].x+points[i].y,points[i].x);
for(int j=1;j<i;j++)
{
if(points[j].y<=points[i].y)
{
f[i]+=(p-f[j]*C(points[i].x-points[j].x+points[i].y-points[j].y,points[i].x-points[j].x)%p);
f[i]%=p;
}
}
}
printf("Case #%d: %lld\n",++cas,f[k]%p);
}
}
UVALive 6916 Punching Robot dp的更多相关文章
- UVALive - 6916 Punching Robot Lucas+dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/96344 Punching Robot Time Limit: 1000MS64bit IO Format: ...
- 【BZOJ1408】[Noi2002]Robot DP+数学
[BZOJ1408][Noi2002]Robot Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HI ...
- UVALive - 6952 Cent Savings dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/116998 Cent Savings Time Limit: 3000MS 问题描述 To host a re ...
- UVALive - 6529 找规律+dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/47664 Eleven Time Limit: 5000MS 问题描述 In this problem, we ...
- UVaLive 6801 Sequence (计数DP)
题意:给定一个序列,有 n 个数,只有01,然后你进行k次操作,把所有的1变成0,求有多种方法. 析:DP是很明显的,dp[i][j] 表示进行第 i 次操作,剩下 j 个1,然后操作就两种,把1变成 ...
- UVaLive 6697 Homework Evaluation (DP)
题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...
- UVaLive 7374 Racing Gems (DP,LIS)
题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. ...
- UVALive 6947 Improvements(DP+树状数组)
[题目链接] https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...
- UVaLive 3490 Generator (KMP + DP + Gauss)
题意:随机字母组成一个串,有一个目标串,当这个由随机字母组成的串出现目标串就停止,求这个随机字母组成串的期望长度. 析:由于只要包含目标串就可以停止,所以可以先把这个串进行处理,也就是KMP,然后dp ...
随机推荐
- bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...
- bzoj千题计划184:bzoj1261: [SCOI2006]zh_tree
http://www.lydsy.com/JudgeOnline/problem.php?id=1261 dp[l][r][dep] 区间[l,r]内的节点,根在dep层的最小代价 枚举根i,dp[ ...
- Xcode多种Build Configuration配置使用
Build Configuration? Xcode默认会有2个编译模式,一个是Debug,一个是Release.Release下不能调试程序,编译时有做编译优化,会比用Debug打包出来的运行快,另 ...
- GORM 中文文档
由于篇幅问题,本文只是快速开始部分,下面是完整地址. 中文文档地址:http://gorm.book.jasperxu.com/ 中文文档项目地址:https://github.com/jasperx ...
- 按esc键 关闭模态框
<!-- help start --> <div class="modal fade" id="myModal" tabindex=" ...
- django+mysql安装和设置
之前我们已经用sqlite建立了第一个web app.今天来学习如何在django中使用MySQL. 首先需要安装MySQL,到官网下载安装包:https://dev.mysql.com/downlo ...
- 运算符,比如+, -, >, <, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。
python解释器在碰到+号运算符时,会调用加号前面的对象的__add__方法 class a: def __add__(self,b): print "ghh" aa=a() a ...
- JS异常简单处理
有时候JS某一处报错会导致整个页面JS的运行出问题,于是想的简单研究一下JS的错误处理机制.更详细的可以自己参考网站研究: https://developer.mozilla.org/zh-CN/ ...
- 在一台win10上启动多个mysql
1.因为项目需要用一个已经有数据的mysql,而我之前已经安装了一个mysql(之前的mysql上面也是有东西,不想删除) 想办法.... mysqld.exe --defaults-file=D: ...
- python3之模块psutil系统性能信息
psutil是个跨平台库,能够轻松实现获取系统运行的进程和系统利用率,包括CPU.内存.磁盘.网络等信息. 它主要应用于信息监控,分析和限制系统资源及进程的管理.它实现了同等命令命令行工具提供的功能, ...