【bzoj4676】 两双手
http://www.lydsy.com/JudgeOnline/problem.php?id=4767 (题目链接)
题意
求在网格图上从$(0,0)$走到$(n,m)$,其中不经过一些点的路径方案数。
Solution
转换一下就变成了题意中的模型。我们将网格上的起点和不允许经过的点全部看做一类点,用$f[i]$表示从第$i$个点不经过其它点到达终点的路径条数,用$D(i,j)$表示个点之间的路径条数,$T$表示终点。转移:
\begin{aligned} f[i]=D(i,T)-\sum_j D(i,j)*f[j] \end{aligned}
其中$j$在$i$的右上方。然后注意特判一下问题无法转换的情况。
细节
预处理别预处理少了?
代码
// bzoj4767
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=1000;
int Ex,Ey,Ax,Ay,Bx,By,na,nb,n,m;
LL fac[maxn*maxn],ifac[maxn*maxn],f[maxn];
struct point {
int x,y;
friend bool operator <= (point a,point b) {return a.x<=b.x && a.y<=b.y;}
}p[maxn]; LL power(LL a,LL b) {
LL res=1;
while (b) {
if (b&1) (res*=a)%=MOD;
b>>=1;(a*=a)%=MOD;
}
return res;
}
LL C(int n,int m) {
return fac[n]*ifac[m]%MOD*ifac[n-m]%MOD;
}
bool cmp(point a,point b) {
return a.x==b.x ? a.y<b.y : a.x<b.x;
}
LL D(point a,point b) {
return C(b.x+b.y-a.x-a.y,b.x-a.x);
}
int main() {
scanf("%d%d%d",&Ex,&Ey,&n);
scanf("%d%d%d%d",&Ax,&Ay,&Bx,&By);
if ((Ex*By-Ey*Bx)%(Ax*By-Ay*Bx)) {puts("0");return 0;}
na=(Ex*By-Ey*Bx)/(Ax*By-Ay*Bx);
nb=Bx ? (Ex-Ax*na)/Bx : (Ey-Ay*nb)/By;
if (p[0].x<0 || p[0].y<0) {puts("0");return 0;}
for (int ca,cb,x,y,i=1;i<=n;i++) {
scanf("%d%d",&x,&y);
if ((x*By-y*Bx)%(Ax*By-Ay*Bx)) continue;
ca=(x*By-y*Bx)/(Ax*By-Ay*Bx);
cb=Bx ? (x-Ax*ca)/Bx : (y-Ay*ca)/By;
if (0<=ca && ca<=na && 0<=cb && cb<=nb) p[++m]=(point){ca,cb};
}
sort(p+1,p+1+m,cmp);
n=na+nb;
p[m+1]=(point){na,nb};p[0]=(point){0,0};
fac[0]=1;for (int i=1;i<=n;i++) fac[i]=fac[i-1]*i%MOD;
ifac[n]=power(fac[n],MOD-2);
for (int i=n;i>=1;i--) ifac[i-1]=ifac[i]*i%MOD;
for (int i=m;i>=0;i--) {
f[i]=D(p[i],p[m+1]);
for (int j=i+1;j<=m;j++)
if (p[i]<=p[j]) (f[i]+=MOD-D(p[i],p[j])*f[j]%MOD)%=MOD;
}
printf("%lld",f[0]);
return 0;
}
【bzoj4676】 两双手的更多相关文章
- bzoj4767两双手 容斥+组合
		4767: 两双手 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 684 Solved: 208[Submit][Status][Discuss] ... 
- bzoj 4767: 两双手 组合 容斥
		题目链接 bzoj4767: 两双手 题解 不共线向量构成一组基底 对于每个点\((X,Y)\)构成的向量拆分 也就是对于方程组 $Ax * x + Bx * y = X $ \(Ay * x + B ... 
- BZOJ4767: 两双手【组合数学+容斥原理】
		Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v) ... 
- 【BZOJ】4767: 两双手【组合数学】【容斥】【DP】
		4767: 两双手 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1057 Solved: 318[Submit][Status][Discuss] ... 
- 【BZOJ4767】两双手(动态规划,容斥)
		[BZOJ4767]两双手(动态规划,容斥) 题面 BZOJ 题解 发现走法只有两种,并且两维坐标都要走到对应的位置去. 显然对于每个确定的点,最多只有一种固定的跳跃次数能够到达这个点. 首先对于每个 ... 
- BZOJ 4767: 两双手 [DP 组合数]
		传送门 题意: 给你平面上两个向量,走到指定点,一些点不能经过,求方案数 煞笔提一开始被题面带偏了一直郁闷为什么方案不是无限 现在精简的题意.....不就是$bzoj3782$原题嘛,还不需要$Luc ... 
- 2019.02.11 bzoj4767: 两双手(组合数学+容斥dp)
		传送门 题意简述:你要从(0,0)(0,0)(0,0)走到(ex,ey)(ex,ey)(ex,ey),每次可以从(x,y)(x,y)(x,y)走到(x+ax,y+ay)(x+ax,y+ay)(x+ax ... 
- BZOJ.4767.两双手(组合 容斥 DP)
		题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ... 
- BZOJ4767 两双手
		本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ... 
随机推荐
- kettle学习笔记(一)——入门与安装
			一.概述 1.kettle是什么 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定.中文名称叫水壶,该项目的主程序 ... 
- 20155222卢梓杰 实验九 Web安全基础
			实验九 Web安全基础 今天不多bb,打开webgoat就是干好吧 1.简单字符串sql注入 可以看到这个实验说明是 "下表允许用户查看其信用卡号码.尝试插入一个SQL字符串,以显示所有信用 ... 
- EZ 2017 01 07 t
			这名字诡异(然而就是这样) 这次主要是yekehe和yu‘ao都来了,所以很开心的讨论(上了200). 但是,yu’ao dalao又AK了!(666666) 不过总体难度也不高,主要是T3没思路. ... 
- libgdx学习记录11——平铺地图TiledMap
			地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机Otho ... 
- R绘图 第九篇:绘制散点图和气泡图(ggplot2)
			绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ... 
- 2、Docker镜像和镜像管理
			一.镜像介绍 1.定义 一个只读层被称为镜像,一个镜像是永久不会变的. 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的. 但是所有的变更都发生顶层的可写 ... 
- stl源码剖析 详细学习笔记deque(3)
			protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ... 
- 移动端三合一瀑布流插件(原生JS)
			没有前言,先上DEMO(手机上看效果更佳)和 原码. 瀑布流形式的图片布局方式在手机等移动端设备上运用广泛,比较常见的是下面前两种: 一.等宽等高 这种形式实现起来非常容易,这里就不再多说. 二.等宽 ... 
- Js_数组操作
			用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ... 
- 【Alpha】第一次Scrum Meeting
			本次会议内容概括如下: 总结了一周以来大家任务的完成情况,对消耗时间进行统计,并评估了各自对团队的贡献(影响)程度 整理并融合所有人的工作的结果生成了相应的总结性文档 进一步明确了团队中各个成员的定位 ... 
