AT_abc021_d [ABC021D] 多重ループ
题目描述
新入职的高桥君作为某企业的新晋程序员被分配到了部门。他负责的第一项工作是对以下伪代码所表示的程序进行加速。
```
n←(标准输入)
ans←0
for i=1..n
for j=i..n
ans ← ans+1
显示 ans 的值
```
对于高桥君来说,这样的工作简直是小菜一碟。只要考虑每个 $i$ 的内层循环次数,并利用求和公式,就能得到 $ans=n+n-1+\dots+1=n(n+1)/2$,用这个公式就能立刻算出答案。
高桥君成功实现了显著的加速,部门对他的期待也随之水涨船高。于是上司又给了他更进一步的任务。
这次的任务是:当 for 循环嵌套深度为 $k$ 时,对如下程序进行加速。
```
n←(标准输入)
k←(标准输入)
ans←0
for a_1=1..n
for a_2=a_1..n
for a_3=a_2..n
…
for a_k=a_{k-1}..n // 设 a_0=1
ans ← ans+1
显示 ans 的值
```
即使是高桥君,这次也有些犯难了,因为无法直接使用求和公式。
经过一番思考,他发现,这个程序输出的答案等于满足 $1\leq a_1\leq a_2\leq\dots\leq a_k\leq n$ 的整数组 $(a_1,a_2,\dots,a_k)$ 的个数。然而,他没能想到如何计算这样的组合数。
作为他的同事,你决定帮他写出解决这个问题的程序。不过,由于答案可能非常大,请输出 $ans$ 对 $1,000,000,007(=10^9+7)$ 取模后的结果。
输入格式
输入从标准输入按以下格式给出。
> $n$ $k$
- 第 $1$ 行给出整数 $n\ (1\leq n\leq 10^5)$。
- 第 $2$ 行给出整数 $k\ (1\leq k\leq 10^5)$。
输出格式
请输出第 $2$ 个程序最终 $ans$ 的值对 $1,000,000,007$ 取模后的结果。
注意不要忘记输出末尾的换行符。
说明/提示
### 部分分
本题设有部分分。
- 对于 $1\leq n\leq 1000$ 且 $1\leq k\leq 1000$ 的数据集,答对可得 $99$ 分。
- 对于包含上述数据集在内的所有数据集都答对,可再得 $1$ 分。
由 ChatGPT 4.1 翻译