#P13465. [GCJ 2008 #1C] Increasing Speed Limits

    ID: 13276 远端评测题 6000ms 1024MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>动态规划 DP2008树状数组Google Code Jam

[GCJ 2008 #1C] Increasing Speed Limits

Description

你在高速公路上行驶时因超速被交警拦下。原来他们一直在跟踪你,他们惊讶地发现你一路都在加速,完全没有踩刹车!现在你急需一个借口来解释这一切。

你决定说:“我看到的所有限速标志都是递增的,所以我一直在加速。”警察听后大笑,并把你经过的这段高速公路上所有的限速标志都告诉了你,并表示你不太可能这么幸运,刚好只看到了一段递增的标志。

现在你需要估算这种情况发生的概率,换句话说,就是要找出给定序列中有多少个不同的严格递增子序列。空子序列不计入答案,因为那意味着你根本没看任何限速标志!

例如,(1,2,5)(1, 2, 5)(1,4,2,3,5,5)(1, 4, 2, 3, 5, 5) 的一个递增子序列,并且我们要计数两次,因为有两种方式可以从原序列中选出 (1,2,5)(1, 2, 5)

Input Format

第一行输入一个整数 NN,表示测试用例的数量。接下来有 NN 组测试数据。每组测试数据的第一行为 nnmmXXYYZZ,用空格分隔。nn 表示限速标志序列的长度,mm 表示生成数组 AA 的长度。接下来的 mm 行,每行一个整数,依次为 A[0]A[0]A[m1]A[m-1]

使用 AAXXYYZZ,按照如下伪代码生成限速标志序列。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

注意:输入的生成方式仅用于减小输入文件的体积,与解题方法无关。

Output Format

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

2
5 5 0 0 5
1
2
1
2
3
6 2 2 1000000000 6
1
2
Case #1: 15
Case #2: 13

Hint

样例说明

对于第 22 个测试用例,限速标志序列应为 1,2,0,0,0,41, 2, 0, 0, 0, 4

数据范围

  • 1N201 \leq N \leq 20
  • 1m1001 \leq m \leq 100
  • 0X1090 \leq X \leq 10^9
  • 0Y1090 \leq Y \leq 10^9
  • 1Z1091 \leq Z \leq 10^9
  • 0A[i]<Z0 \leq A[i] < Z

小数据范围(15 分,测试点 1 - 可见)

  • 1mn10001 \leq m \leq n \leq 1000

大数据范围(35 分,测试点 2 - 隐藏)

  • 1mn5000001 \leq m \leq n \leq 500000

由 ChatGPT 4.1 翻译