【BZOJ】4767: 两双手【组合数学】【容斥】【DP】
4767: 两双手
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1057 Solved: 318
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 1 1 0
2 3
Sample Output
Solution
看起来很像一般的网格图求路径数,在没有障碍物的情况下,处理出到达终点分别用两种步数走的步数(解方程唯一固定,再用组合数学,方案数就等于$C(x+y,x)$,$x$和$y$分别是两种步数的次数。
可是这道题有障碍格。
所以在上述基础上进行容斥DP即可。将能走到的所有障碍点的$x$和$y$(从原点出发)预处理出来,(将终点的$x$、$y$值也放入结构体)排序后,后面的DP值要容斥减去前面能到达它的方案数。最后答案就是$dp[n]$。(因为一开始保证了结构体里所有障碍点都比目标点要小)
【注意】预处理阶乘的逆元线性从后往前线性求得,不然会TLE!
Code
#include<bits/stdc++.h>
#define mod 1000000007
#define LL long long
using namespace std; int Ax, Ay, Bx, By, n, Ex, Ey; struct Node {
int x, y;
} QAQ[];
bool cmp(Node a, Node b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } LL mpow(LL a, LL b) {
LL ans = ;
for(; b; b >>= , a = a * a % mod)
if(b & ) ans = ans * a % mod;
return ans;
} void cal(int &x, int &y) {////解方程计算两种步数
LL a1, a2, b1, b2;
b1 = y * Ax - x * Ay, b2 = Ax * By - Ay * Bx;
a1 = x * By - y * Bx, a2 = Ax * By - Ay * Bx;
if(a2 == || b2 == ) { x = -, y = -; return ; }
if((a1 / a2) * a2 != a1 || (b1 / b2) * b2 != b1) { x = -, y = -; return ; }
x = a1 / a2, y = b1 / b2;
} LL fac[], inv[];
LL C(LL a, LL b) {
if(a < b) return ;
return fac[a] * inv[a-b] % mod * inv[b] % mod;
} void init() {
fac[] = ;
for(int i = ; i <= ; i ++)
fac[i] = fac[i-] * i % mod;
inv[] = ; inv[] = mpow(fac[], mod - );
for(int i = ; i >= ; i --)
inv[i] = inv[i + ] * (i + ) % mod;////线性求阶乘逆元
} LL f[];
int main() {
scanf("%d%d%d", &Ex, &Ey, &n);
scanf("%d%d%d%d", &Ax, &Ay, &Bx, &By);
cal(Ex, Ey);
for(int i = ; i <= n; i ++) {
scanf("%d%d", &QAQ[i].x, &QAQ[i].y);
cal(QAQ[i].x, QAQ[i].y);
if(QAQ[i].x < || QAQ[i].y < || QAQ[i].x > Ex || QAQ[i].y > Ey) {/////不合法的步数筛掉
n --; i --;
}
}
QAQ[++n].x = Ex, QAQ[n].y = Ey;
sort(QAQ + , QAQ + + n, cmp); init(); for(int i = ; i <= n; i ++) {
f[i] = C(QAQ[i].x + QAQ[i].y, QAQ[i].x);
if(f[i] == ) continue;
for(int j = ; j < i; j ++) {
f[i] -= (f[j] * C(QAQ[i].x - QAQ[j].x + QAQ[i].y - QAQ[j].y, QAQ[i].x - QAQ[j].x)) % mod;/////容斥
f[i] = (f[i] % mod + mod) % mod;
}
}
printf("%lld", f[n]);
return ;
}
【BZOJ】4767: 两双手【组合数学】【容斥】【DP】的更多相关文章
- BZOJ.4767.两双手(组合 容斥 DP)
题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ...
- bzoj 4767: 两双手 组合 容斥
题目链接 bzoj4767: 两双手 题解 不共线向量构成一组基底 对于每个点\((X,Y)\)构成的向量拆分 也就是对于方程组 $Ax * x + Bx * y = X $ \(Ay * x + B ...
- 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 两双手 - 动态规划 - 容斥原理
题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...
- BZOJ 4767 两双手
题解: 发现这种题目虽然可以想出来,但磕磕碰碰得想挺久的 根据数学可以知道组成方案是唯一的(集合) 然后发现每个使用的大小可能是接近n^2的 直接dp(n^4)是过不了的 那么先观察观察 我们可以把每 ...
- BZOJ 4767: 两双手 [DP 组合数]
传送门 题意: 给你平面上两个向量,走到指定点,一些点不能经过,求方案数 煞笔提一开始被题面带偏了一直郁闷为什么方案不是无限 现在精简的题意.....不就是$bzoj3782$原题嘛,还不需要$Luc ...
- 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 ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
随机推荐
- 【Tomcat】Tomcat容器 web.xml详解
Tomcat的安装目录下的conf目录下的web.xml文件有许多配置,例如: <init-param> <param-name>debug</param-name& ...
- Linux USB驱动学习总结(二)---- USB设备驱动
USB 设备驱动: 一.USB 描述符:(存在于USB 的E2PROM里面) 1. 设备描述符:struct usb_device_descriptor 2. 配置描述符:struct usb_c ...
- 二十一、springboot之定制URL匹配规则(项目中遇到的问题:get方式传参,带有小数点,被忽略)
一.问题描述: get方式传参,在传送价格,积分时(带有小数点),debug后台微服务接受到的参数,却不带小数点,如:price是0.55,后台接受后却是0 二.解决 在WebConfiguratio ...
- python网络编程--进程线程
一:什么是进程 一个程序执行时的实例被称为一个进程. 每个进程都提供执行程序所需的资源.一个进程有一个虚拟地址空间.可执行代码.对系统对象的开放句柄.一个安全上下文.一个独特的进程标识符.环境变量.一 ...
- bootstrap表单按回车会自动刷新页面的问题
想给form表单增加回车自动提交的功能 $('#password').keydown(function(event){ if (event.keyCode == 13) $('#login').cli ...
- 回归模型效果评估系列3-R平方
决定系数(coefficient of determination,R2)是反映模型拟合优度的重要的统计量,为回归平方和与总平方和之比.R2取值在0到1之间,且无单位,其数值大小反映了回归贡献的相对程 ...
- The Art Of Computer Programming: 1.1
The Art Of Computer Programming: 1.1 */--> div.org-src-container { font-size: 85%; font-family: m ...
- Hex Dump In Many Programming Languages
Hex Dump In Many Programming Languages See also: ArraySumInManyProgrammingLanguages, CounterInManyPr ...
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- 【POJ】1286.Necklace of Beads
题解 群论,我们只要找出所有的置换群的所有循环节 具体可参照算法艺术与信息学竞赛 旋转的置换有n个,每一个的循环节个数是gcd(N,i),i的范围是0到N - 1 翻转,对于奇数来说固定一个点,然后剩 ...