【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;
}
时间: 2024-10-10 05:38:04

【bzoj4676】 两双手的相关文章

Bzoj4767 两双手

Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 553  Solved: 160 Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便 决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v)移动到(u+Ax,v+Ay)而另一双手能让 马从(u,v)移动到(u+Bx,v+By).小W看见老W的下棋方式,觉得非常有趣,他开始思考一个问题:假设棋盘是个无限 大的

[BZOJ 4767]两双手(组合数学+Dp)

Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便 决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v)移动到(u+Ax,v+Ay)而另一双手能让 马从(u,v)移动到(u+Bx,v+By).小W看见老W的下棋方式,觉得非常有趣,他开始思考一个问题:假设棋盘是个无限 大的二维平面,一开始马在原点(0,0)上,若用老W的两种方式进行移动,他有多少种不同的移动方法到达点(Ex,Ey )呢?两种移动方法不

bzoj4767两双手 容斥+组合

4767: 两双手 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 684  Solved: 208[Submit][Status][Discuss] Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便 决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v)移动到(u+Ax,v+Ay)而另一双手能让 马从(u,v)移动到(u+Bx,v+By).小W看见老

【题解/总结】两双手(格路问题)/格路问题的某一本质

[题解]两双手(格路问题) 题目大意:求从\((0,0)\)到\((Ex,Ey)\)不经过给定障碍点的方案数.你每次移动只能是加上向量\(e_1\)或者向量\(e_2\),\(e_1,e_2\)中的基底都是整数. 考虑转化一下这个问题,从某个点走到在他右上角的某点需要加上\(ae_1+be_2\),这样我们就可以解出\(a,b\).我们把\((a,b)\)拿出来建立新的坐标系,就变成了简单的格路问题了.结合[题解]CF559C C. Gerald and Giant Chess(容斥+格路问题)

BZOJ 4767 两双手

题解: 发现这种题目虽然可以想出来,但磕磕碰碰得想挺久的 根据数学可以知道组成方案是唯一的(集合) 然后发现每个使用的大小可能是接近n^2的 直接dp(n^4)是过不了的 那么先观察观察 我们可以把每个障碍点的表示也搞出来 这样就变成了一张网格图求起点到终点的方案数 然后考虑一下容斥,枚举第一个经过的障碍点是谁(之后就随便走了) 然后发现做这个的时候在不断递归 那可以直接按照x,y排个序 依次递推过去 原文地址:https://www.cnblogs.com/yinwuxiao/p/888387

bzoj 4767 两双手 - 动态规划 - 容斥原理

题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, y + B_y)$.棋盘上有$n$个禁止位置不能经过,问马从$(0, 0)$走到$(E_x, E_y)$的方案数. 容斥是显然的. 每确定经过$k$个禁止位置的方案数的容斥系数是$(-1)^{k}$. 考虑带上容斥系数来动态规划, 注意到去掉重复的禁止位置后,$(0, 0), (E_x, E_y)

[BZOJ]2017省队十连测推广赛1

听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点r为根的子树和的总和.(点数.操作数不超过10^5) 思路:感觉是三题中最难的.给出的[l,r]区间在树上没有实际意义,不好利用数据结构维护.考虑若不修改,可以一遍dfs算出每个点对应的dfs序,这样每棵子树都对应一个dfs序的区间,前缀和一下就能O(1)查子树和,再按点的编号顺序把子树和前缀和一下

找一个陪你聊天的人,很重要

2016-01-08 江徐 经典短篇阅读 作者:江徐丨来源:江徐的自留地(ID:jiangxv08) 有人说,找一个对你知冷知热的人,很重要. 有人说,找一个时刻把你放在第一位的人,很重要. 我要说,找一个与陪你聊天的人,很重要,甚至更重要. 对方既然能够在日日相对夜夜同眠的生活中,与你共绘一幅你爱谈天我爱笑的好景致,又怎么可能对你不是知冷知热.不把你放在重要位置呢? 最近一期金星秀,嘉宾是单眼皮型男赵又廷.从交谈中不难看出,赵又廷是个内敛低调.并非健谈的男人.正是这个坦言自己生活中很宅,而且挺

作为360老员工,谈谈和周鸿祎的接触和印象

最近看前BOSS周鸿祎的新闻不少,才在微博点评"中国首位00后CEO":无知无畏狂妄自大,该点醒他! ,被很多媒体报道和雷军的点评做比较.还有回应360借壳上市传闻,网上议论纷纷.今天还在2017互联网安全大会上透露,将会发布一款"安全车". 其实3年前写过一篇类似的文章,当时是360如日中天的时候,已经被媒体评为互联网巨头3个半中的"半个".但短短两年多的时间过后,很多人都评价360已经开始走下坡路了.只能说移动互联网时代,变幻莫测,一旦没把握