题目链接

bzoj4767: 两双手

题解

不共线向量构成一组基底

对于每个点\((X,Y)\)构成的向量拆分

也就是对于方程组

$Ax * x + Bx * y = X \(
\)Ay * x + By * y = Y\(
\)x,y\(不能为负问题转化为NE lattice path
\)f(i)\(表示从0到i点不经过障碍的方案数
枚举第一个碰到的障碍点
\)f(i) = cnt(0,i) - \sum_j dp[j] cnt(j,i)$

\(cnt(x,y)\)为从点x到y的方案数

代码


#include<cstdio>
#include<algorithm>
#include<cstring>
#define gc getchar()
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = gc;
while(c < '0' || c > '9') {if(c == '-') f = -1 ; c = gc; }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
return x * f;
}
void print(int x) {
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
#define int long long
const int maxn = 507;
const int M = 500000;
const int mod = 1e9 + 7;
int Ex,Ey,n;
int Ax,Ay,Bx,By;
int f[maxn];
struct Node {
int x,y;
bool operator < (const Node a) const {
return x == a.x ? y < a.y : x < a.x;
}
} p[maxn];
int fac[M + 7],inv[M + 7];
inline int fstpow(int x,int k) {
int ret = 1;
for(;k;k >>= 1,x = 1ll * x * x % mod)
if(k & 1) ret = 1ll * ret * x % mod;
return ret;
}
inline void calc(int &x,int &y) {
int a1 = x * By - y * Bx,a2 = Ax * By - Ay * Bx;
int b1 = x * Ay - Ax * y,b2 = Bx * Ay - Ax * By;
if(!a2 || !b2) {x = y = -1;return; }
if((a1 % a2) || (b1 % b2)) {x = y = -1;return; }
x = a1 / a2,y = b1 / b2;
}
inline int C(int x,int y){
if(x < y) return 0;
return 1ll * fac[x] * inv[y] % mod * inv[x - y] % mod;
}
main() {
fac[0] = fac[1] = 1; for(int i = 1;i <= M;++ i) fac[i] = 1ll * fac[i - 1] * i % mod;
inv[0] = 1;
inv[M] = fstpow(fac[M],mod - 2); for(int i = M - 1;i >= 1;-- i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod; 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[0].x = p[0].y = 0;
p[++ n].x = Ex,p[n].y = Ey; std::sort(p + 1,p + n + 1); for(int i = 1;i <= n;++ i) {
f[i] = C(p[i].x + p[i].y,p[i].x);
if(f[i] == 0) continue;
for(int j = 1;j < i;++ j) {
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;
f[i] %= mod;
f[i] += mod ;
f[i] %= mod;
}
}
print(f[n]);
return 0;
}

bzoj 4767: 两双手 组合 容斥的更多相关文章

  1. BZOJ.4767.两双手(组合 容斥 DP)

    题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ...

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

    题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...

  3. BZOJ 4767 两双手

    题解: 发现这种题目虽然可以想出来,但磕磕碰碰得想挺久的 根据数学可以知道组成方案是唯一的(集合) 然后发现每个使用的大小可能是接近n^2的 直接dp(n^4)是过不了的 那么先观察观察 我们可以把每 ...

  4. BZOJ 4767: 两双手 [DP 组合数]

    传送门 题意: 给你平面上两个向量,走到指定点,一些点不能经过,求方案数 煞笔提一开始被题面带偏了一直郁闷为什么方案不是无限 现在精简的题意.....不就是$bzoj3782$原题嘛,还不需要$Luc ...

  5. 【BZOJ】4767: 两双手【组合数学】【容斥】【DP】

    4767: 两双手 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1057  Solved: 318[Submit][Status][Discuss] ...

  6. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

  7. bzoj4710: [Jsoi2011]分特产 组合+容斥

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 289  Solved: 198[Submit][Status] ...

  8. BZOJ.4558.[JLOI2016]方(计数 容斥)

    BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...

  9. [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】

    题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...

随机推荐

  1. SpringBoot定制错误的Json数据

    (1)自定义异常处理&返回定制Json数据 @ControllerAdvice public class MyExceptionHandler { @ResponseBody @Excepti ...

  2. 同步阿里云镜像到本地,在本地搭建YUM仓库

    1.下载阿里云镜像repo文件 项目使用CentOS6系统,因此我下载的文件是: # CentOS-Base.repo # # The mirror system uses the connectin ...

  3. log4j2使用入门(二)——与不同日志框架的适配

    在之前博客中已经指出log4j2可以与不同的日志框架进行适配,这里举一些实际应用进行说明: 1.比如我们在项目中使用了log4j2作为日志器,使用了log4j-api2.6.2.jar和log4j-c ...

  4. MIPI协议学习总结(一)

    一.MIPI 简介: MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写.MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准. 已经完 ...

  5. kafka系列七、kafka核心配置

    一.producer核心配置 1.acks :发送应答(默认值:1) 生产者在考虑完成请求之前要求leader收到的确认的数量.这控制了发送的记录的持久性.允许以下设置: acks=0:设置为0,则生 ...

  6. VC++常用数据类型

    原文地址:https://www.cnblogs.com/yincheng01/archive/2008/12/31/2213386.html 一.              VC常用数据类型列表 二 ...

  7. PYTHON-操作系统基础

    预习:操作系统基础1,编程语言的分类2,多版本共存3,执行python程序的两种方式4,变量5,输入输出6,运算符7,基本数据类型8,流程控制之if ------------------------- ...

  8. abstract class 和 interface 区别

    本文出自与:heipai:tsg666 含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有 abstract 方法的类必须定义为 abstract ...

  9. exe4j中"this executable was created with an evaluation version exe4j"的解决

    在使用exe4j时,如果您的exe4j没有注册,在运行有exe4j转换的*.jar为*.exe的可执行文件时,会提示:"this executable was created with an ...

  10. php中按指定标识及长度替换字符的方法代码

    /** * 按指定标识及长度替换字符 * @param $str * @param int $start 开始的位数 * @param int $end 后面保留的位数 * @param string ...