hdu_5794_A Simple Chess(lucas+dp)
题意:
给你n,m,从(1,1)到(n,m),每次只能从左上到右下走日字路线,有k(<=100)的不能走的位置,问你有多少方案
题解:
画图可看到路线是一个杨辉三角的图,然后我们可以将对应的x,y转换到对应的点上,也可以吧杨辉三角看成一个平行四边形,
我这里看成的平行四边形,设dp[i]为从起点到第i个障碍物的的方案数,那么dp[i]=dp[i]-sum(dp[j](第j个点能走到i这个点)*(j到i的方案数))。
然后我们把终点放到最后,最后求出的dp[end]就是答案
#include<cstdio>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const ll P=;
ll f[P+],r[P+];
ll C(ll n,ll m){return n<m?:f[n]*r[n-m]%P*r[m]%P;}
ll lucas(ll n,ll m){
if(n<m||m<)return ;
if(!m||n==m)return ;
return C(n%P,m%P)*lucas(n/P,m/P)%P;
}
void init(){
int i;
for(r[]=r[]=f[]=f[]=,i=;i<P;i++){
f[i]=f[i-]*i%P,r[i]=-r[P%i]*(P/i)%P;
while(r[i]<)r[i]+=P;
}
for(i=;i<P;i++)r[i]=r[i]*r[i-]%P;
} ll n,m,k,ic=,dp[]; struct point{
ll x,y;
bool operator<(const point &b)const{return x<b.x;}
}p[]; int main(){
init();
while(~scanf("%lld%lld%lld",&n,&m,&k))
{
n--,m--;
int fg=;
F(i,,k)
{
scanf("%lld%lld",&p[i].x,&p[i].y),p[i].x--,p[i].y--;
if(p[i].x==n&&p[i].y==m)fg=;
}
printf("Case #%lld: ",ic++);
if(n==&&m==)puts("");
else if((n+m)%!=||fg)puts("");
else
{
ll x,y,tx,ty;
sort(p+,p++k);
p[++k].x=n,p[k].y=m;
F(i,,k)
{
if((p[i].x+p[i].y)%==)
{
x=(p[i].x+p[i].y)/,y=min(p[i].x,p[i].y)-x;
dp[i]=lucas(x,y);
F(j,,i-)
{
if(p[j].y<p[i].y&&p[j].x<p[i].x)
{
ll xx=p[i].x-p[j].x,yy=p[i].y-p[j].y;
if((xx+yy)%==)
{
ll tx=(xx+yy)/,ty=min(xx,yy)-tx;
dp[i]-=(lucas(tx,ty)*dp[j])%P;
dp[i]=(dp[i]+P)%P;
}
}
}
}
}
printf("%lld\n",dp[k]);
}
}
return ;
}
hdu_5794_A Simple Chess(lucas+dp)的更多相关文章
- 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的网格.网格上有一些点是障碍,不能经过.行走的方式是向右下角跳马步.求 ...
- Codeforces Round #313 (Div. 2) E. Gerald and Giant Chess (Lucas + dp)
题目链接:http://codeforces.com/contest/560/problem/E 给你一个n*m的网格,有k个坏点,问你从(1,1)到(n,m)不经过坏点有多少条路径. 先把这些坏点排 ...
- A Simple Chess (Lucas组合数 + 容斥)
题意:走马步,要求向右向下,不能走进禁止的点.求方案数. 思路:若是n*m比较小的话,那么可以直接DP.但是这道题目不行.不过我们仔细分析可以知道从某个点到某个点是一个组合数,但是数据太大,mod值很 ...
- 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)
题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- 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 ...
- hdu5794 A Simple Chess 容斥+Lucas 从(1,1)开始出发,每一步从(x1,y1)到达(x2,y2)满足(x2−x1)^2+(y2−y1)^2=5, x2>x1,y2>y1; 其实就是走日字。而且是往(n,m)方向走的日字。还有r个障碍物,障碍物不可以到达。求(1,1)到(n,m)的路径条数。
A Simple Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 5794 A Simple Chess(杨辉三角+容斥原理+Lucas定理)
题目链接 A Simple Chess 打表发现这其实是一个杨辉三角…… 然后发现很多格子上方案数都是0 对于那写可能可以到达的点(先不考虑障碍点),我们先叫做有效的点 对于那些障碍,如果不在有效点上 ...
随机推荐
- Hibernate5-课程笔记2
单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...
- C#字符串常见操作总结
string类常用的方法和总结小记
- 给图片使用border-radius 图片会变成圆的。
- # 欢迎使用Markdown编辑器写博客
似的发射点 甜甜 他inn他 absct{ for i 士大夫似的 胜多负少 import os import sys import subprocess import textwrap if sys ...
- Android 关于 OnScrollListener 事件顺序次数的简要分析
在 Android 的 OnScrollListener 整个事件我主要分析下他的执行顺序: 实现滚动事件的监听接口 new AbsListView.OnScrollListener(){ @Over ...
- 浏览器 CSS 兼容写法的测试总结
做前端最讨厌的就是 IE6,7,8,虽然被淘汰的浏览器,但是在中国用户仍然很多,不可能像国外网站一样直接就不管它了,这样会流失很多流量啊. 现在有了IE9,IE10还好些,几乎和 Chrome,Fir ...
- 《JS权威指南学习总结--第九章 类和模板》
内容要点: 一. 1.第六章详细介绍了JS对象,每个JS对象都是一个属性集合,相互之间没有任何联系.在JS中也可以定义对象的类,让每个对象都共享某些属性,这种"共享"的特性是非常有 ...
- mysql创建用户、授权[转]
一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...
- post请求和get请求
get请求在链接后面带参数,容易出现乱码,是坑(慎用),有固定的长度 一般的用的就是post方式 <form action="<%=basePath%>upload&quo ...
- vconfig 的使用
http://man.cx/vconfig%288%29 vconfig 作用: (802.1q)VLAN配置程序 root@hbg:/# vconfig --helpBusyBox v1.22.1 ...