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) 的总和。