zoukankan      html  css  js  c++  java
  • 省选模拟96 题解

    A. 多边形
    因为本题保证了 (n) 不为偶数,所以 (n) 没有 (frac{n}{2}) 这个循环节。
    然后考虑 (frac{n}{3}) 这个循环节,如果能形成锐角一定有 (m=3)
    如果存在更小的循环节,那么一定不存在锐角了。
    所以尽量特殊处理一下 (m=3) 这个情况,然后对于 (ans_0),用全集-补集去求。
    对于其他的情况,可以考虑求出循环同构意义下合法的边长排列有多少个,给这个玩意乘 (n) 就是答案。
    这个玩意的求法可以是容斥,大概的思想就是如果存在相邻的两个边长之和 (>frac{n+1}{2}) 那么存在一个锐角。
    如果有这个事情,就是说 (x_{i+1} geq max(0,frac{n+1}{2}-x_i-1)+1)
    然后分类讨论这样的 (x_i < frac{n+1}{2})(geq frac{n+1}{2}),可以附加一个权值或者删去一个点之类的,大概恶心一下就能出来了。

    B. 仙人掌
    大神的做法是这样的,考虑每个节点儿子集合中,不同取值的个数。
    可以发现这个玩意最多只能达到 (sqrt{m}) 级别。
    原因是,如果要影响到这个儿子 (son[x]) 的权值:
    要么操作当前节点 (x),对 (son[x]) 的取值个数不产生影响。
    要么操作 (son[son[x]]),那么一次操作只会对单个 (son[x]) 产生影响。
    这样的话随便维护一下不同的取值个数就好了。比较麻烦的是还得考虑父亲方向的权值。
    其实对于节点 (x) 造成影响的只有 (f[x])(son[x])
    对于前者,只要每次操作更新父节点,对于后者,维护每个节点对每个儿子产生共同的影响即可。
    正解是用 (trie) 树维护儿子集合的异或和,利用的大概就是 (x oplus x+1=2^{zerobit(x)}-1) 这个性质。
    从低位到高位建这棵树,然后每次只要交换左右儿子,递归考虑 (x) 的这一位仍然是 (1) 就好了。

    C. 多项式
    设前 (n) 项的的权值总和为 (x),考虑后 (m-n) 项。
    为了方便计算,新加一项来将至多为 (S) 转化为恰好为 (S),可以得到方案数 (inom{S-x}{m-n})
    然后用第一类斯特林数通常幂展开下降幂,来把这个组合数展开。
    接着用二项式定理把 ((S-x)^i) 展开成 (x^i) 的形式,然后对于前 (n) 项,可以直接用二项式定理倍增求出 (x^i) 的总和。

  • 相关阅读:
    在内部局域网内搭建HTTPs
    如何创建自己的Nuget包
    Scratch入门
    灰度发布 & 蓝绿部署
    .net异步方法初探
    [转]批处理静默自动安装证书
    住院病案首页数据填写质量规范(暂行)
    DRGs
    【规范】电子病历系统功能规范(试行)
    Red Hat Enterprise Linux 8配置YUM源的两种方式
  • 原文地址:https://www.cnblogs.com/skyh/p/12891803.html
Copyright © 2011-2022 走看看