题号:NC285708
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
小苯和格格正在玩一款名为“吃糖果”的游戏,游戏的过程是这样的:
两人面前有

堆糖果,从左到右编号从

到

,其中第

堆糖果中有

颗糖果。初始时小苯在

号位置(第一堆糖果的左侧),格格在

号位置。(第

堆糖果的右侧)
假设小苯目前位于

号糖果堆的位置,格格位于

号糖果堆(

),则每秒钟都会发生如下过程:

如果

(即两人已经相邻),则游戏结束。
否则,两人轮流操作,小苯先手:

轮到小苯时,小苯可以选择待在原地;或跳跃到

号糖果堆,然后选择吃掉
所有 
颗糖果,或者不吃。

轮到格格时,格格可以选择待在原地;或跳跃到

号糖果堆,然后选择吃掉
所有 
颗糖果,或者不吃。
(当然,吃掉某堆糖果的前提是此堆糖果之前没被吃掉。换句话说每堆糖果被任何人吃掉后都会消失。)
现在我们考虑所有结束的游戏,为了公平起见,小苯希望自己和格格吃掉的糖果数量相同,他想知道有多少种不同的游戏过程能满足他的要求,请你帮他算一算吧。
(游戏过程的不同性在下方备注处给出了定义。)
输入描述:
本题含有多组测试数据。
第一行一个正整数
,表示测试数据的组数。
接下来对于每组测试数据,输入包含两行。
第一行一个正整数
,表示糖果的总堆数。
第二行
个正整数
,表示每堆糖果的总个数。
输出描述:
对于每组测试数据,输出一行一个整数,表示不同的游戏过程数。
(由于结果可能很大,因此你只要输出答案对
取模的值即可。)
备注:
考虑两个游戏过程:
游戏过程
: 结束时,小苯位于
,小苯选择拿走的糖果堆的编号集合为
,格格选择拿走的糖果堆编号集合为
。
游戏过程
: 结束时,小苯位于
,小苯选择拿走的糖果堆的编号集合为
,格格选择拿走的糖果堆编号集合为
。
定义两个游戏过程相同,当且仅当:
,同时
且
。
否则两个游戏过程不相同。