小䓤的凸包
题号:NC222912
时间限制:C/C++/Rust/Pascal 6秒,其他语言12秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

定义 ,其中 (x,y) 表示 (0,0) 指向 (x,y) 的向量,一个向量 (x,y) 的斜率为一个实数 。再定义一个向量 (i,j) 的权值为 ,其中 a,b 为给定常量。

小䓤最初有 S_n 中的所有向量,他想要在其中选出一些向量按照斜率从小到大顺次拼接成一个右下凸壳,其中他希望每种在 S_n 中出现的斜率都出现在选择的向量中且凸壳的横坐标极差(也即选出的向量的横坐标之和)最小。容易发现给定 n 后小䓤在上述要求下选出的集合是定的。

做完上一步操作后,他会用一条斜率为 的线去切这个凸壳,这条线会从无穷远的下方向上移动直到碰到凸壳上的点并截取其右上方的部分。

给出 a,b 求对 S_n 做上述两步操作后的凸壳上的向量的代价和,答案对 取模。

下面举一个例子说明上述过程。



那么第一步操作后我们会选出 这三个向量,对斜率 的向量 (1,1),(2,2) 我们只保留 (1,1) 因为
(2,2) 斜率与 (1,1) 相同但其横向跨度更长。第二步使用斜率为 去切割凸壳后剩下的凸壳上的向量为 ,代价和为

输入描述:

共一行五个整数 

输出描述:

一个整数表示每组询问的答案
示例1

输入

复制
2 4 3 1 1

输出

复制
3

说明

与题目中举的例子相同
示例2

输入

复制
50 2 5 4 3

输出

复制
928433684
示例3

输入

复制
500000 3 4 2 2

输出

复制
15675121

备注: