描述
小红拿到了两个整数 a 和 b 。她希望你构造两个正整数 x 和 y 满足:
1、x mod y=a
2、y mod x=b
其中 p mod q 代表 p 除以 q 得到的余数。
共有t组询问。输入描述:
第一行输入一个正整数t,代表询问的次数。
接下来的t行,每行输入两个整数a和b,代表一次询问。
1≤t≤10000
0≤a,b≤10^9输出描述:
输出t行,每行输出两个正整数(不能大于2^31−1),代表询问的答案。有多解时输出任意即可。
如果无解,请输出"-1 -1"。示例1
输入:
2 2 3 0 0输出:
5 3 1 1
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.有t组正整数
2.每组正整数包含两个正整数a和b
3.求问满足每组正整数a和b的x和y
4.x、y满足:
(1)x mod y = a
(2)y mod x = b
二、解题思路
1.x mod y = a的意思是x除以y得z余a
x / y = z
y * z + a = x
y mod x = b
y / x = w
w * x + b = y
yz + wx + a + b = x + y
a + b = x + y - yz - wx
a + b = x(1-w) + y(1-z)
a + b = x(1-y/x)+y(1-x/y)
2. 假设a是5,如果希望x%y=5
最简单的方式就是让x比y大5,且y不能等于0
比如y=1,x=6,x%y = 6%1 = 5
假设b是7,希望y%x = 7
1 % 6 = 1,如果一个较小的数对一个较大得数求余,那么会等于自身
所以我们可以让y = 7,x=7+6-1=12
这样的话x%y=12%7=5=a
y%x=7%12=7=b
3.所以我们先让y=1,然后x=a+y=a+1,这样的话x%y=a+1%1=a
然后y=1+b-1=b,然后x=a+1-1+b这样的话y%x=b%a+b=b
a+b%b=a
4.如果a为0的时候呢
x%y=0证明x等于y或者x是y得倍数
假设a为0b为1
如果y%x=1那么y=x+b=x+b或者y=b=1,x大于y,因为需要x是y的倍数,所以x刚好可以等于2
y=1,x=2
1%2=1
2%1=0
所以如果某一个a是0得时候,x是y得2倍,y则等于b,x则等于2b
但是这是b不为0得情况
5.如果b等于0呢,这样的情况a和b需要相等,但是又不能等于0,我们可以将他们设置成1
6.假设a为12
b为4
这个时候,如果按照原来的想法,a!=0,b!=0将x设置为a+b=16将y设置为b=4
会有问题,因为a+b%b得到的值不是a12而是0,为什么呢,因为a是b得倍数,
当a大于b的时候可以这样,将x设置为a,y设置为a+b
这样的话x就是4,y是16
x%y=12%16=12
y%x=16%12=4
7.如果a=b的时候呢?如果a或者b不为0的话,(就是都是0)
没有解,返回-1就可以了
三、具体步骤
使用的语言是C
#include <stdint.h>
#include <stdio.h>int main() {int t;if (scanf("%d", &t) != EOF) {for(int i = 0; i < t; i++) {int a, b;if(scanf("%d%d", &a, &b) != EOF) {int x, y;// printf("a:%d b:%d\n", a, b);if(a == 0 && b == 0) {x = 1;y = 1;} else if(a == 0) {x = 2 * b;y = b;} else if(b == 0) {y = 2 * a;x = a;} else if(a > b){x = a;y = a + b;} else if(b > a){x = a + b;y = b;} else if(a == b){x = -1;y = -1;}//printf("x mod y: %d\n", x % y);//printf("y mod x: %d\n", y % x);printf("%d %d\n", x, y);} else printf("error1\n");}} else printf("error\n");return 0;
}