zoukankan      html  css  js  c++  java
  • [BZOJ 4767] 两双手(容斥/DP)

    Problem

    [#4767.两双手] 题目地址

    [#3782. 上学路线] 题目地址 一道很像的题。

    Solution

    将两个行走方式看做两个二维向量 (vec{A},vec{B}),令其为该向量空间的基,对该空间变换后,得到每个禁止点的新坐标和终点的新坐标。

    可以发现从一个点 (u(u_1,u_2)) 走到另外一个点 (v(v_1,v_2))行走步数是唯一的(由于基向量线性组合时 (avec{A} + bvec{B}) 系数 (a,b) 为正),假设走法一用了 (x) 次,走法二用了 (y) 次,那么 (u)(v) 随意行走的方案数(可以经过障碍点)就有 (dbinom{x+y}{x}) 种。

    对于所有的障碍点,对其总行走步数 (z(x+y=z)) 从小到大排序。特别的,令 ((0,0)) 为第 (0) 个障碍点,终点为第 (n+1) 个障碍点。

    (f[i]) 表示从 ((0,0)) 到第 (i) 个障碍点,并且中间不经过障碍点的方案数,(g(i,j)) 表示从第 (i) 障碍点到第 (j) 个障碍点随意行走的方案数。

    考虑全集:(从 ((0,0)) 到第 (i) 个障碍点随意行走的方案数)为 (g(0,i))(其中包含不合法方案)。

    考虑不合法方案

    • 不合法方案至少经过 ([1,i-1]) 中的一个障碍点,可以用第一个经过的障碍点为划分依据,将不合法方案的集合划分,故不合法方案数为 (sum^{i-1}_j f[j]*g(j,i-1))

    综上,则有:

    [f[i] = g(0,i)-sum^{i-1}_j f[j]*g(j,i-1) ]

    则答案为 (f[n+1])

    (g(i,j)) 可以用组合数预处理出来,复杂度 (O(n^2))。计算 (f[n+1]) 复杂度 (O(n^2))。时间复杂度 (O(n^2))

    Code

    Talk...

    第一道题要用线性代数做一步转换,第二道题要 (Lucas) 加中国剩余定理,暂时不会码,哭了。

    Summary

    多做题!

  • 相关阅读:
    webStorm常用快捷键
    npm 常用指令
    webpack配置详解
    Tornado-StaticFileHandler参考
    python-希尔排序
    python的__init__几种方法总结
    gitlab和github一起使用
    Git的一些知识
    关于Django的理解
    python-快速排序
  • 原文地址:https://www.cnblogs.com/BaseAI/p/14023516.html
Copyright © 2011-2022 走看看