【BZOJ4767】两双手(动态规划,容斥)
【BZOJ4767】两双手(动态规划,容斥)
题面
题解
发现走法只有两种,并且两维坐标都要走到对应的位置去。
显然对于每个确定的点,最多只有一种固定的跳跃次数能够到达这个点。
首先对于每个点都计算出两种跳跃方法的次数。
然后按照跳跃次数排序。
显然只可能从跳跃次数少的跳跃到跳跃次数多的点。
考虑\(f[i]\)表示到达第\(i\)个点且不经过前面任何一个障碍点的方案数。
\(f[i]=C_{x+y}^x\),其中\(x,y\)表示两种方法跳跃的次数。
然后容斥减去经过前面任何一个点的方案数就好了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1111111
#define MOD 1000000007
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int Ex,Ey,Ax,Ay,Bx,By,n;
struct Node{int x,y;}p[MAX];
bool cmp(Node a,Node b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}
int jc[MAX],jv[MAX],inv[MAX],f[MAX];
int C(int n,int m){if(n<m)return 0;return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
void Calc(int &x,int &y)
{
ll a1,a2,b1,b2;
a1=x*By-y*Bx;a2=Ax*By-Ay*Bx;
b1=x*Ay-Ax*y;b2=Bx*Ay-Ax*By;
if(a2==0||b2==0){x=-1;y=-1;return;}
if((a1/a2)*a2!=a1||(b1/b2)*b2!=b1){x=-1;y=-1;return;}
x=a1/a2;y=b1/b2;
}
int main()
{
Ex=read();Ey=read();n=read();
Ax=read(),Ay=read();Bx=read();By=read();
Calc(Ex,Ey);
for(int i=1;i<=n;++i)
{
p[i].x=read(),p[i].y=read();
Calc(p[i].x,p[i].y);
if(p[i].x<0||p[i].y<0||p[i].x>Ex||p[i].y>Ey)--n,--i;
}
p[++n]=(Node){Ex,Ey};sort(&p[1],&p[n+1],cmp);
jc[0]=jv[0]=inv[0]=inv[1]=1;
for(int i=1;i<MAX;++i)jc[i]=1ll*jc[i-1]*i%MOD;
for(int i=2;i<MAX;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<MAX;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
for(int i=1;i<=n;++i)
{
f[i]=C(p[i].x+p[i].y,p[i].x);
if(!f[i])continue;
for(int j=1;j<i;++j)
f[i]=(f[i]-1ll*f[j]*C(p[i].x-p[j].x+p[i].y-p[j].y,p[i].x-p[j].x)%MOD+MOD)%MOD;
}
printf("%d\n",f[n]);
return 0;
}
【BZOJ4767】两双手(动态规划,容斥)的更多相关文章
- bzoj 4767: 两双手 组合 容斥
题目链接 bzoj4767: 两双手 题解 不共线向量构成一组基底 对于每个点\((X,Y)\)构成的向量拆分 也就是对于方程组 $Ax * x + Bx * y = X $ \(Ay * x + B ...
- BZOJ.4767.两双手(组合 容斥 DP)
题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ...
- bzoj4767两双手 容斥+组合
4767: 两双手 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 684 Solved: 208[Submit][Status][Discuss] ...
- 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 ...
- BZOJ4767: 两双手【组合数学+容斥原理】
Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v) ...
- BZOJ4767 两双手
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ4767 两双手(组合数学+容斥原理)
因为保证了两向量不共线,平面内任何一个向量都被这两个向量唯一表示.问题变为一张有障碍点的网格图由左上走到右下的方案数. 到达终点所需步数显然是平方级别的,没法直接递推.注意到障碍点数量很少,那么考虑容 ...
- bzoj 4767 两双手 - 动态规划 - 容斥原理
题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
随机推荐
- 利用 Intel Realsense做SLAM开发(一)
最近手里拿到一台Realsense D435,就是这个: https://click.intel.com/intelr-realsensetm-depth-camera-d435.html 所以准备拿 ...
- Java实现网上商城
// 第一个JavaWeb项目 //练手项目没有使用框架 github下载 https://github.com/dejavudwh/Online-Shopping 项目截图 1.基本实现了购物网站该 ...
- 《More Effective C++ 》读书笔记(二)Exception 异常
这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...
- phpldapadmin具体设置
一.需求 1.属性隐藏 只显示用户名,部门(因为是单OU设计为了做区分),登录密码 2.属性顺序显示 部门>用户名>登录密码 3.使用UID可以登陆 用户可以使用账户(自己的名字)登 ...
- 基于腾讯云CLB实现K8S v1.10.1集群高可用+负载均衡
概述: 最近对K8S非常感兴趣,同时对容器的管理等方面非常出色,是一款非常开源,强大的容器管理方案,最后经过1个月的本地实验,最终决定在腾讯云平台搭建属于我们的K8S集群管理平台~ 采购之后已经在本地 ...
- XSS留言板实现
XSS 留言板实现-笔记 预备知识 XSS漏洞 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS ...
- php 中关于pdo的使用
之前一段时间,开始了php的研究,看了关于PDO的一些资料,发现不错,整理和总结一下,作为开发笔记,留待日后使用,<PHP开发笔记系列(一)-PDO使用>. PDO是PHP Data Ob ...
- 《英文版c++语言程序设计》
compatibility [kəm,pætɪ'bɪlɪtɪ] n.兼容 compatible [kəm'pætɪb(ə)l] adj. 兼容的:能共处的:可并立的 interdependent [ɪ ...
- Flip the Bits(思维)
You are given a positive integer n. Your task is to build a number m by flipping the minimum number ...
- 团队计划第二期Backlog
团队计划第二期Backlog 一. 计划会议过程 今天中午我们小组就我们团队开发第二阶段的冲刺召开计划会议,总结了第一阶段开发的问题.不足和经验教训,然后对本次冲刺计划进行了合理的规划和 ...