Rolling Girl
题号:NC235383
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

miku 掉进了一个环里,但是由于这个环有魔力的加持,她出不去了。

她发现自己只能在这个环上滚动,不过幸运的是这个环上有许多位置,按照  标号,相邻位置间距离为 ,第  个位置有一个耐久度 ,每次撞击会消耗  点耐久度。
一旦一个位置的耐久度耗尽,这个环的魔力就会消失,她就能从最初进入的位置  号位置逃出。

由于环境因素,她每次落地都会弹起一定高度,从而正向(以标号增大的方向为正向)越过一些位置再次落地。我们默认每次越过的距离是相等的。

由于 miku 很可爱,所以她进行了 n 次逃出(每次逃出后环上的耐久度会复原),第 i 次逃出以 i 作为每次越过的距离,求她这 n 次逃出需要的弹跳次数之和。
由于答案可能会很大,你需要输出答案对  取模的值。
考虑到读入量可能太大,故使用生成器生成数据。
数据生成器如下:
unsigned seed, mod; 
unsigned read() {
    seed ^= seed << 13; 
    seed ^= seed >> 5; 
    seed ^= seed << 7; 
    return seed % mod + 1; 
}
...
// 在 main 函数中:
for (int i = 1; i <= n; i++) a[i] = read();

输入描述:

假设第一次的落脚点标号为 

第一行一个数 ,表示位置的数量。
第二行两个数 

输出描述:

输出答案,结果对 1004535809 取模。
示例1

输入

复制
5
1003 5

输出

复制
25

说明

生成的数组  为 
设越过距离为 ,我们只考虑  的情况,其余情况可以一一对应。
当  取  至  时,都需要弹跳  次。
当  取  时,miku 在原地弹了五下。
故答案为 25
示例2

输入

复制
5
998244353 5

输出

复制
21