这是一道构造题,对每个给定的正整数 m,需要找到两个不同的正整数 a,b,满足 1≤a,b<m 且 mmoda=mmodb。若不存在这样的数对,输出 -1。
由于只需输出任意一组合法解,我们可以直接使用分类构造的方法,不需要枚举或暴力比较余数。
当 m≤3 时,候选的正整数太少,无法选出满足条件的 a,b:
在学习模运算时,小明遇到了一个有趣的构造问题:给定一个正整数 m,他希望找到两个不同的正整数 a 和 b,满足 1≤a,b<m,并且 m 除以 a 的余数与 m 除以 b 的余数相等,即 mmoda=mmodb。如果存在这样的数对,请输出任意一组 (a,b);如果没有任何满足条件的数对,则输出 -1。
数据组数不超过 104,每个给定的整数 m 不超过 1018,保证 1≤m≤1018。
第一行包含一个整数 T,表示测试数据的组数(1≤T≤104)。接下来 T 行,每行包含一个整数 m,表示一次询问。
对于每一组测试数据,输出一行。若无解,输出 -1;否则输出两个不同的正整数 a 和 b(用空格分隔),满足 1≤a,b<m 且 mmoda=mmodb。如果有多组合法答案,输出任意一组即可。
输入
1
3
输出
-1
说明
当 m=3 时,可选的数只有 1 和 2。
计算得 3bmod1=0,3bmod2=1,两者余数不相等。且不存在其他小于 3 的不同正整数,因此无解,输出 -1。
输入
2
4
5
输出
1 2
2 4
说明
第一组 m=4 为偶数(mge4),取 a=1,b=2。计算得 4bmod1=0,4bmod2=0,余数相等,且 1,2<4,满足要求。 第二组 m=5 为奇数(mge5),取 a=2,b=m−1=4。计算得 5bmod2=1,5bmod4=1,余数相等,且 2,4<5,满足要求。
输入
2
1000000000000000000
999999999999999989
输出
1 2
2 999999999999999988
说明
第一组 m=1018 为偶数,取 a=1,b=2。因为 1018bmod1=0,1018bmod2=0,且 1,2 均小于 1018,符合要求。 第二组 m=999999999999999989 为奇数且 mge5,取 a=2,b=m−1=999999999999999988。奇数 m 满足 mbmod2=1,同时 mbmod(m−1)=1,两个余数相等,且 2 和 m−1 均严格小于 m。
▶️视频试看,开通会员即可查看完整视频题解:1.题目讲解 2.思路分析 3.逐行代码手写
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册