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

题目描述

给定一个长度为 n 的序列 ,一个正整数 m,以及一个非负整数 k,下标从 0 开始的无穷序列 b 如下所示:

你可以对序列 a 执行以下操作:

选择两个后缀,其中一个在模 m 意义下加上序列 b,另一个在模 m 意义下减去序列 b,形式化描述如下:

  1. 选择两个整数 x, y 满足 ,注意可以 x = y;
  2.  修改为
  3.  修改为

注意操作3.是在操作2.修改完后的数组上进行,执行以上三步算一次操作。要求操作结束后序列 a 为全0序列,输出最少操作次数,若无解输出-1。

符号说明:

: k 个不同的球里取 i 个的取法方案数。

,其中 表示对 x 下取整,例如:

输入描述:

每个测试点包含多个测试用例;

第一行一个整数 T ()---表示测试用例的数量 。每个测试用例的格式如下:

第一行三个整数 n, k, m (, , )---分别表示序列长度以及给定的 k 和模数;

第二行 n 个整数  ()---表示给定的序列;

保证所有测试用例的 n 之和不超过

输出描述:

有 T 组输出,每组输出的格式如下:

第一行如果答案存在则输出最少操作次数,否则输出-1;

示例1

输入

复制
2
5 3 7
0 0 6 3 5
5 3 7
1 5 2 3 5

输出

复制
1
-1