#650. 统计构造好字符串的方案数

统计构造好字符串的方案数

统计构造好字符串的方案数

题目描述

给你四个整数 lowhighzeroone。你从一个空字符串开始,每次操作可以选择以下两种之一(可重复任意次):

  • 在当前字符串末尾添加 '0' 恰好 zero 次;
  • 在当前字符串末尾添加 '1' 恰好 one 次。

如果最终得到的字符串长度在区间 [low, high] 内(包含端点),则称其为 好字符串

请你返回不同好字符串的数目。由于答案可能非常大,请对结果取模 109+710^9 + 7 后输出。

注意:即使两个字符串内容相同,只要构造方式不同但结果一样,仍视为同一个字符串。本题统计的是不同的字符串内容,而不是构造路径。


输入格式

一行,包含四个整数:
low high zero one
其中:

  • 1lowhigh1051 \le \text{low} \le \text{high} \le 10^5
  • 1zero,onelow1 \le \text{zero}, \text{one} \le \text{low}

输出格式

输出一个整数,表示好字符串的数量对 109+710^9 + 7 取模后的结果。


示例

示例 1

输入:

3 3 1 1

输出:

8

解释:
每次可以加 1 个 '0' 或 1 个 '1',因此所有长度为 3 的二进制字符串均可构造(共 23=82^3 = 8 个)。


示例 2

输入:

2 3 1 2

输出:

5

解释:
合法的好字符串有:

  • 长度为 2:"00"(两次加 '0')、"11"(一次加 '1' 两次)
  • 长度为 3:"000"(三次 '0')、"110"(先 '1'×2 再 '0'×1)、"011"(先 '0'×1 再 '1'×2)

共 5 个。


提示

  • 1lowhigh1051 \le \text{low} \le \text{high} \le 10^5
  • 1zero,onelow1 \le \text{zero}, \text{one} \le \text{low}