题目链接

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的方案数

代码


  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define gc getchar()
  5. #define pc putchar
  6. inline int read() {
  7. int x = 0,f = 1;
  8. char c = gc;
  9. while(c < '0' || c > '9') {if(c == '-') f = -1 ; c = gc; }
  10. while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
  11. return x * f;
  12. }
  13. void print(int x) {
  14. if(x >= 10) print(x / 10);
  15. pc(x % 10 + '0');
  16. }
  17. #define int long long
  18. const int maxn = 507;
  19. const int M = 500000;
  20. const int mod = 1e9 + 7;
  21. int Ex,Ey,n;
  22. int Ax,Ay,Bx,By;
  23. int f[maxn];
  24. struct Node {
  25. int x,y;
  26. bool operator < (const Node a) const {
  27. return x == a.x ? y < a.y : x < a.x;
  28. }
  29. } p[maxn];
  30. int fac[M + 7],inv[M + 7];
  31. inline int fstpow(int x,int k) {
  32. int ret = 1;
  33. for(;k;k >>= 1,x = 1ll * x * x % mod)
  34. if(k & 1) ret = 1ll * ret * x % mod;
  35. return ret;
  36. }
  37. inline void calc(int &x,int &y) {
  38. int a1 = x * By - y * Bx,a2 = Ax * By - Ay * Bx;
  39. int b1 = x * Ay - Ax * y,b2 = Bx * Ay - Ax * By;
  40. if(!a2 || !b2) {x = y = -1;return; }
  41. if((a1 % a2) || (b1 % b2)) {x = y = -1;return; }
  42. x = a1 / a2,y = b1 / b2;
  43. }
  44. inline int C(int x,int y){
  45. if(x < y) return 0;
  46. return 1ll * fac[x] * inv[y] % mod * inv[x - y] % mod;
  47. }
  48. main() {
  49. fac[0] = fac[1] = 1;
  50. for(int i = 1;i <= M;++ i) fac[i] = 1ll * fac[i - 1] * i % mod;
  51. inv[0] = 1;
  52. inv[M] = fstpow(fac[M],mod - 2);
  53. for(int i = M - 1;i >= 1;-- i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
  54. Ex = read(),Ey = read(),n = read();
  55. Ax = read(),Ay = read(),Bx = read(),By = read();
  56. calc(Ex,Ey);
  57. for(int i = 1;i <= n;++ i) {
  58. p[i].x = read(),p[i].y = read();
  59. calc(p[i].x,p[i].y);
  60. if(p[i].x < 0 || p[i].y < 0 || p[i].x > Ex || p[i].y > Ey) n --,i --;
  61. }
  62. p[0].x = p[0].y = 0;
  63. p[++ n].x = Ex,p[n].y = Ey;
  64. std::sort(p + 1,p + n + 1);
  65. for(int i = 1;i <= n;++ i) {
  66. f[i] = C(p[i].x + p[i].y,p[i].x);
  67. if(f[i] == 0) continue;
  68. for(int j = 1;j < i;++ j) {
  69. 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;
  70. f[i] %= mod;
  71. f[i] += mod ;
  72. f[i] %= mod;
  73. }
  74. }
  75. print(f[n]);
  76. return 0;
  77. }

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. python顺序执行多个py文件

    python顺序执行多个py文件 假如我要执行code目录下的python程序,假设该目录下有1.py,2.py,3.py,4.py四个文件,但是我想执行1.py,2.py,4.py,则可在该目录下创 ...

  2. /etc/profile 路径出错后相关的命令失效解决方式

    关于 Linux 的配置文件 /etc/profile 路径出错后相关的命令失效解决方式(如:ls,vi不能用) 今天学习LINUX 下配置jdk 和安装tomcat 通过VI编辑/etc/profi ...

  3. linux regulator之浅见【转】

    转自:http://blog.csdn.net/batoom/article/details/17081651 1: 校准器的基本概念 所谓校准器实际是在软件控制下把输入的电源调节精心输出. Regu ...

  4. NTFS文件系统简介

    原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.html 1.简介 NTFS(New Technology File S ...

  5. eclipse配置JDK

    配置JDK 注意:此处配置的是JDK安装路径,不是JRE!!!

  6. .net下web页生产一维条形码

    code-39 前台 aspx <asp:Image ID="imgBandCode" runat="server" ImageUrl="~/W ...

  7. gulp自动化构建教程

    gulp及gulpfile.js编写示例    本文主要记录一个gulpfile.js示例,以免以后用的时候遗忘.但首先还是要了解gulp是什么以及如何使用. 一.什么是gulp 简单来说:就是压缩前 ...

  8. OCM_第六天课程:Section3 —》数据库可用性

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  9. 前端开发必须知道的JS(一) 原型和继承

    原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会讲下闭包,希望对大家有所帮助.若有疑问或不正之处,欢迎提出指正和讨论. 一. 原型与构造函数 Js所有的函数都有一个protot ...

  10. 移位操作符 << >> >>>

    按位操作符只可用于int类型,其它类型都会转化位int类型在操作,并且只有数值右端的低5位才右用(因为2^5=32) <<  左移位操作符,低位补零 >>  右移位操作符,有符 ...