CFCF2180F2.Control Car (Hard Version)
省选/NOI-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这两个版本的区别在于限制条件,包括变量的取值范围、时间和内存限制。仅当你同时解决了本题目的两个版本时,才可以进行 hack。请注意,困难版本的正确解未必是简单版本的有效解。
我们有一辆“控制小车”,它的行为类似于一个随机变量。正如随机变量既不是真正随机,也不是真正变量,我们的“控制小车”既不是汽车,也不可控!
无论如何,给定一个 n×m 的网格,这个网格由 n+1 条水平线和 m+1 条竖直线交叉组成。网格包含 (n+1)(m+1) 个交点,这些交点是单元格四周的角。
一种“朝向”是给每个交点分配一个四个基本方向(上、下、左、右)中的一个。因此,总共有 4(n+1)(m+1) 种可能的朝向方案。
对于一种朝向,请按如下流程操作:
- 对于网格上的每个点,从该点按分配的方向画出一堵单位长度的墙。墙壁可能会重叠或伸出网格边界之外。
- 将控制小车放在左上角的单元格 (1,1)。然后,只要小车没有停止,它就会按照这些规则移动:
- 如果小车可以向下移动(即向下到达正下方单元格的路径没有被墙堵住),则它会因重力向下移动。
- 如果它不能向下移动但可以向右移动(即通向右侧相邻单元格的路径没有被墙堵住),则它会向右移动。
- 如果小车移动出网格或无法移动,则停止。
- 如果控制小车最终停在网格内部,则该朝向方案是合法的。
请计算所有合法朝向的数量。由于答案可能非常大,请输出其对 109+7 取模后的结果。
输入格式
每组测试数据包含多个测试用例。第一行为测试用例个数 t(1≤t≤50)。每个测试用例描述如下。
每个测试用例的第一行包含两个整数 n 和 m(1≤n≤50,1≤m≤1015),表示网格的大小。
所有测试用例中 n 的总和不超过 50。
输出格式
对于每个测试用例,输出合法朝向的数量,对 109+7 取模后的结果。
输入输出样例
输入#1
5 1 1 2 1 1 2 2 2 44 1000000000000000
输出#1
40 1072 784 91072 179226577
说明/提示
在第一个测试用例中,要使某个朝向合法,至少需要左下角或右下角的墙壁覆盖网格的下边界。同时还需要右上角或右下角的墙壁覆盖网格的右边界。如果这两个条件都满足,则该朝向为合法朝向。
现在,如果右上角朝下、左下角朝右,则左上角和右下角可以指向任意方向。因此,此类情况有 16 种合法朝向。

第一个类型的合法朝向示意图。如果右上角或左下角指向不同方向,则右下角必须覆盖对应的边界。因此,只有其中一个可以指向不同方向。总共有 2⋅3⋅4=24 种此类合法朝向。

第二种类型的合法朝向示意图。因此,最终答案是 16+24=40。

两个非法朝向的示例。
可视化工具链接