省选模拟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\),可以得到方案数 \(\binom{S-x}{m-n}\)。
然后用第一类斯特林数通常幂展开下降幂,来把这个组合数展开。
接着用二项式定理把 \((S-x)^i\) 展开成 \(x^i\) 的形式,然后对于前 \(n\) 项,可以直接用二项式定理倍增求出 \(x^i\) 的总和。