题意:
线段树是这样一种数据结构:根节点表示区间 [1, n];对于任意一个表示区间 [l, r] 的节点,若 l < r, 则取 mid = ⌊l+r/2⌋,该节点的左儿子为 [l, mid],右儿子为 [mid + 1, r];若 l = r,则它为叶子。 一棵树的匹配是指一个树边集合,满足任意两条边没有公共端点。一棵树的最大匹配是指所有合法 匹配方案中,所选树边最多的匹配方案。 给定一棵表示 [1, n] 的线段树,请求出它的最大匹配中有多少条边,并求出有多少种最大匹配的方 案。因为答案很大,请对 998244353 取模输出。 Input 第一行包含一个正整数 n(1 ≤ n ≤ 1018)。 Output 输出一行两个整数,第一个表示最大匹配中的边数,第二个表示方案数对 998244353 取模的结果。f[n]表示大小为n的线段树的最大匹配数,g[n]表示方案数.
结论:线段树每一层的节点大小最多有两种. 如果上一层有2k,2k-1,那下一层就有k,k-1.如果上一层有2k,2k+1,那么下一层就有k,k+1.反正最多两种. 层数logn,那么有用状态2logn个,200不到,map开dp数组+记忆化搜索,完事.#include#include