标签:code 绝对值 组合数 seq 组合 预处理 最小值 负数 最小
先把正的负的 \(1\dots a-1,1\dots b-1\) 填上,如果正数多那么最后一个负数放两者和的相反数,负的多类似
考虑没两种高度的差值来决定方案数
那么排序去重之后将两两的差 \(+1\) 乘起来即可
给白色红色蓝色分别赋 \(1,2,3\) 的权值,那么不难发现合成出来的数和底下两个的权值和模 \(3\) 为 \(0\)
那么就是每个点到金字塔顶的方案数乘权值的和(还要通过 \(n\) 的奇偶性来判断正负)
从 \((1,1)\) 到 \((n,x)\) 的方案数的组合意义就是可以选择 \(x-1\) 个地方向右走一步,那么方案数是 \(\binom {n-1}{x-1}\)
考虑到我们只关注其模 \(3\) 的余数,那么直接记录每个阶乘有多少因子 \(3\) 和模 \(3\) 的余数即可
按照欧拉序的思路不难发现直接遍历这个树,每次回溯的时候给计数器加一的话,遍历到的最后一个点是 \(2(n-1)\)
但是不难关注到我们并不需要在遍历完整个树之后再在回溯时改变计数器
所以计数器的最终值就是 \(2(n-1)-\) 一个链的长度
为了得到最小值,那么可以先整出来直径,以直径的一个端点为根再次进行 \(dfs\)
在 \(dfs\) 的过程中注意对长度大的链最后访问,这个可以按照长链剖分的方式预处理出来重儿子最后访问
当然也可以每次排个序,复杂度也合法
先求前缀和,那么 \(k\) 的个数就是前缀和相同的对数(这里特别注意要把 \(s_0\) 也算上)
我们考虑按照绝对值从小到大加入 \(s_i\),这时候不难发现序列的形态是若干个连续段
同时有一些空缺,而这些空缺的两端都是单调的段,空缺里面的元素比两边的值大
定义 \(dp[i][j][k]\) 表示 \(i\) 个元素,\(j\) 对相同的前缀和,\(k\) 个空缺
转移考虑加入 \(s_i\) 的个数,设其为 \(x\) 则会转移给 \(dp[i+x][j+\binom x2][x-k-2]\),系数为 \(\binom {x-1}{k+1}\)
最后一维的值考虑只放入一个 \(s_i\) 的空缺就被结束了,系数也是类似隔板的东西
统计答案的时候对 \(\rm{dp[i][j][k]\times dp[(2n+1)-i][k-j][k-1]}\) 求和,可以理解为大于 \(0\) 的前缀和 和 小于 \(0\) 的前缀和
实现的话组合数可以直接杨辉三角,由 \(python3,\binom{60}{30}\) 只有 \(1e17\) 左右
F没看,就摸掉了
「解题报告」AtCoder Regular Contest117
标签:code 绝对值 组合数 seq 组合 预处理 最小值 负数 最小
原文地址:https://www.cnblogs.com/yspm/p/14675430.html