#L3679. 「北大集训 2021」算术

    ID: 5559 传统题 1000ms 256MiB 尝试: 3 已通过: 1 难度: 10 上传者: 标签>数论大整数质因数分解快速幂欧几里得算法欧拉函数

「北大集训 2021」算术

题目描述

小 Q 学习了一种判断大数是否是 pp 的倍数的方法。该方法在 bb 进制下进行,需要将数字按每 kk 位分段,然后进行一系列运算。

对于给定的 b,pb, p,小 Q 想知道最小的正整数 kk,使得无论输入如何,输入和对应的输出要么同时是 pp 的倍数,要么同时不是 pp 的倍数,或者报告这样的 kk 不存在。

注意 pp 不一定是质数。

输入格式

第一行包含两个正整数 T,pT, p,表示测试数据组数与方法的 pp 参数。

接下来 TT 行每行一个整数 bb 表示每组测试数据的进制。

保证:

  • 1T1051 \le T \le 10^5
  • 2p10152 \leq p \leq 10^{15}
  • 2p<b10×p2 \leq p < b \leq 10 \times p

输入中的所有数字按照十进制给出。

输出格式

对于每组数据输出一行,若不存在合法的 kk 输出 -1,否则输出最小的满足条件的正整数 kk

样例

输入

2 9
14
16

输出

2
-1

数据范围与提示

子任务编号 2p2\leq p\leq 1T1\leq T\leq 分值
1 3 10 5
2 10
3 10210^2 10210^2
4 10410^4 11
5 10610^6
6 10810^8 10310^3
7 101010^{10}
8 101210^{12} 7
9 101410^{14} 10410^4 17
10 101510^{15} 10510^5

为了选手们的身心健康,下发文件中的 down.cpp 中实现了大整数取模乘法函数 mul(A, B, P),你需要保证 A,B[0,P1]A,B \in [0,P-1],函数会返回 (A×B)modP(A \times B) \bmod P。你可以自由选择使用或者不使用这份代码。其中需要保证你调用时 A,B,PA,B,P 均不超过 101510^{15}