CF2127F Hamed and AghaBalaSar

题目描述

Hamid 为 a+b 问题写了 $3014$ 行代码,并将其中 $10$ 行给了 Hamed;然后 Hamed 想到了如下问题。 给定两个整数 $n$ 和 $m$。 一个数组 $a_1,a_2,\ldots,a_n$ 被称为“snake 数组”,当且仅当满足以下所有条件: - 数组 $a$ 的所有元素都是 $0$ 到 $m$ 之间的整数; - $a_1 + a_2 + \cdots + a_n = m$; - $a_n = \max\left([a_1, a_2, \ldots, a_n]\right)$。 我们定义 $f(a)$,其伪代码如下: ``` function f(array a): pos := 1 res := 0 令数组 nxt 使得 nxt[x] 是最小的下标 y 满足 y > x 且 a[y] > a[x],不存在则未定义。 while pos < n: if a[pos] < a[n]: res += a[nxt[pos]] - a[pos] pos := nxt[pos] else: pos += 1 return res ``` 请计算所有 snake 数组 $a_1,a_2,\ldots,a_n$ 的 $f(a)$ 之和,结果对 $10^9+7$ 取模。

输入格式

每组测试数据包含多个测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的第一行包含两个整数 $n$ 和 $m$($2 \leq n \leq 2 \cdot 10^5$,$0 \leq m \leq 2 \cdot 10^5$)—— snake 数组的长度和所有元素之和。 保证所有测试用例中 $m$ 的总和不超过 $2 \cdot 10^5$。

输出格式

对于每个测试用例,输出一个整数,表示所有 snake 数组 $a_1,a_2,\ldots,a_n$ 的 $f(a)$ 之和,对 $10^9+7$ 取模。

说明/提示

在第一个测试用例中,有三个 snake 数组: - $f([0, 5]) = 5$; - $f([1, 4]) = 3$; - $f([2, 3]) = 1$。 因此,答案为 $5+3+1=9$。 在第二个测试用例中,有六个 snake 数组: - $f([0, 0, 4]) = 4$; - $f([0, 1, 3]) = 3$; - $f([1, 0, 3]) = 2$; - $f([1, 1, 2]) = 1$; - $f([0, 2, 2]) = 2$; - $f([2, 0, 2]) = 2$。 因此,答案为 $4+3+2+1+2+2=14$。 在第五个测试用例中,一个可能的 snake 数组为: - $f([3, 1, 4, 1, 5, 9]) = 6$。 由 ChatGPT 4.1 翻译