链接:https://ac.nowcoder.com/acm/contest/60393/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 给出两个整数 � n 和 � m,请你找出两个整数 � a 和 � b,并且 � a 和 � b 需要同时满足以下条件: { � + � = � � mod � = � { a+b=n a mod b=m 0 ≤ � ≤ 1 0 9 , 1 ≤ � ≤ 1 0 9 0≤a≤10 9 ,1≤b≤10 9 其中, mod mod 代表计算两个数相除后的余数,例如 10 mod 3 = 1 , 4 mod 2 = 0 10 mod 3=1,4 mod 2=0。 如果找不到合法的 � a 和 � b,输出 − 1 −1;否则请输出你找到的 � a 和 � b。如果有多个可行的答案,请输出任意一个。 输入描述: 第一行包含一个整数 � ( 1 ≤ � ≤ 2 ⋅ 1 0 5 ) T(1≤T≤2⋅10 5 ),表示测试用例的组数。 对于每组测试用例: 仅输入一行,包含两个整数 � , � ( 0 ≤ � , � ≤ 1 0 9 ) n,m (0≤n,m≤10 9 )。 输出描述: 对于每组测试用例: 仅输出一行。如果找不到合法的 � a 和 � b,输出 − 1 −1;否则请输出两个整数 � a 和 � b。如果有多个可行的答案,请输出任意一个。 示例1 输入 复制 2 6 2 1 1 输出 复制 2 4 -1
时间: 2024-04-16 07:25:20 浏览: 69
HN_OJ.rar_http://acm.hn_hunan oj_oj_湖南大学oj_湖南大学oj网
5星 · 资源好评率100%
根据题目描述,我们需要找到两个整数a和b,满足以下条件:
1. a + b = n
2. a mod b = m
如果找不到合法的a和b,即没有满足条件的整数对,则输出-1。否则,请输出任意一个满足条件的a和b。
我们可以使用以下方法来解决这个问题:
首先,我们需要注意到,对于a mod b = m,我们可以通过调整a的值来得到不同的b值。具体来说,如果a mod b = m,则对于任意整数k,a + k * b也会满足这个条件。
因此,我们可以使用以下步骤来找到满足条件的a和b:
1. 如果n < m,或者n - m > m,则不存在满足条件的a和b。因为在这种情况下,无论如何调整a和b的值,都无法满足条件a mod b = m。
输出-1并跳过后续步骤。
2. 如果n = m,则满足条件的a和b为0和m。
输出0和m,并跳过后续步骤。
3. 否则,我们可以通过调整a和b的值来找到满足条件的整数对。我们可以先将b固定为m,然后找出满足条件a + b = n的a的值。具体来说,我们可以令a = n - m,并输出a和b的值。
以下是使用C语言实现上述算法的代码:
```c
#include <stdio.h>
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d %d", &n, &m);
if (n < m || n - m > m) {
printf("-1\n");
continue;
}
if (n == m) {
printf("0 %d\n", m);
continue;
}
int a = n - m;
printf("%d %d\n", a, m);
}
return 0;
}
```
注意:上述代码只是一种解决方案,可能不是最优解。该代码在时间和空间限制下应该是有效的,但对于大规模的测试用例可能需要进一步优化。
阅读全文