P13465 [GCJ 2008 #1C] Increasing Speed Limits

题目描述

你在高速公路上行驶时因超速被交警拦下。原来他们一直在跟踪你,他们惊讶地发现你一路都在加速,完全没有踩刹车!现在你急需一个借口来解释这一切。 你决定说:“我看到的所有限速标志都是递增的,所以我一直在加速。”警察听后大笑,并把你经过的这段高速公路上所有的限速标志都告诉了你,并表示你不太可能这么幸运,刚好只看到了一段递增的标志。 现在你需要估算这种情况发生的概率,换句话说,就是要找出给定序列中有多少个不同的严格递增子序列。空子序列不计入答案,因为那意味着你根本没看任何限速标志! 例如,$(1, 2, 5)$ 是 $(1, 4, 2, 3, 5, 5)$ 的一个递增子序列,并且我们要计数两次,因为有两种方式可以从原序列中选出 $(1, 2, 5)$。

输入格式

第一行输入一个整数 $N$,表示测试用例的数量。接下来有 $N$ 组测试数据。每组测试数据的第一行为 $n$、$m$、$X$、$Y$ 和 $Z$,用空格分隔。$n$ 表示限速标志序列的长度,$m$ 表示生成数组 $A$ 的长度。接下来的 $m$ 行,每行一个整数,依次为 $A[0]$ 到 $A[m-1]$。 使用 $A$、$X$、$Y$ 和 $Z$,按照如下伪代码生成限速标志序列。mod 表示取余操作。 ``` for i = 0 to n-1 print A[i mod m] A[i mod m] = (X * A[i mod m] + Y * (i + 1)) mod Z ``` 注意:输入的生成方式仅用于减小输入文件的体积,与解题方法无关。

输出格式

对于每个测试用例,输出一行,格式为 “Case #$T$: $S$”,其中 $T$ 表示测试用例编号,$S$ 表示非空严格递增子序列的数量,对 $1\ 000\ 000\ 007$ 取模。

说明/提示

**样例说明** 对于第 $2$ 个测试用例,限速标志序列应为 $1, 2, 0, 0, 0, 4$。 **数据范围** - $1 \leq N \leq 20$ - $1 \leq m \leq 100$ - $0 \leq X \leq 10^9$ - $0 \leq Y \leq 10^9$ - $1 \leq Z \leq 10^9$ - $0 \leq A[i] < Z$ **小数据范围(15 分,测试点 1 - 可见)** - $1 \leq m \leq n \leq 1000$ **大数据范围(35 分,测试点 2 - 隐藏)** - $1 \leq m \leq n \leq 500000$ 由 ChatGPT 4.1 翻译