Papy 的数列求和
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}Papy 是出题组唯一的高中生,CirnoNine 为了欺负 Papy,给了他一道高中数学经典的等差乘等比的数列求和式:

\displaystyle f(n,a,b,q) = \sum\limits_{i=1}^{n} \Big( (a\times i+b)\times q^i \Big)

\hspace{15pt}由于这个答案可能很大,CirnoNine 只要求 Papy 回答 f(n,a,b,q) \bmod m 即可。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leq T\leq 2 \times 10^4\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入四个整数 m,a,b,q\left(2 \le m \le 10^9,0 \le a,b,q < m\right),含义如题。
\hspace{15pt}第二行输入一个二进制整数 n\left(1 \le n < 2^{5\,000\,000}\right),保证 n 不存在前导 0,含义如题。

\hspace{15pt}除此之外,保证单个测试文件的二进制整数的长度之和(即 \left\lfloor 1+\log_2{n} \right\rfloor 之和)不超过 5 \times 10^6

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行输出一个整数表示 f(n,a,b,q) \bmod m
示例1

输入

复制
3
998244353 0 1 2
1
998244353 1 2 3
101
114514 191 9 810
1010

输出

复制
2
2367
74508

说明

\hspace{15pt}对于第一组测试数据,n = 1,带入可得 f(n,a,b,q) \bmod m = \Big( (0 \times 1 + 1) \times 2^1 \Big) \bmod 998244353 = 2

\hspace{15pt}对于第二组测试数据,n = 5,带入可得 f(n,a,b,q) \bmod m = \Big( (1 \times 1 + 2) \times 3^1 + (1 \times 2 + 2) \times 3^2 + (1 \times 3 + 2) \times 3^3 + (1 \times 4 + 2) \times 3^4 + (1 \times 5 + 2) \times 3^5 \Big) \bmod 998244353 = 2367

\hspace{15pt}对于第三组测试数据,n = 10,带入可得 f(n,a,b,q) \bmod m = 74508

备注:

\hspace{15pt}在几乎全部的情况下,PyPy 的运行速度优于 Python,我们建议您选择对应版本的 PyPy 进行提交、而不是 Python。