m
(
a
3
+
b
3
)
=
n
(
c
3
+
d
3
)
m(a^3+b^3)=n(c^3+d^3)
m(a3+b3)=n(c3+d3)
考
虑
因
式
分
解
(
a
3
+
b
3
)
,
(
c
3
+
d
3
)
:
考虑因式分解(a^3+b^3),(c^3+d^3):
考虑因式分解(a3+b3),(c3+d3):
a
3
+
b
3
=
(
a
+
b
)
3
−
3
a
b
(
a
+
b
)
=
(
a
+
b
)
(
a
2
+
b
2
−
a
b
)
a^3+b^3=(a+b)^3-3ab(a+b)=(a+b)(a^2+b^2-ab)
a3+b3=(a+b)3−3ab(a+b)=(a+b)(a2+b2−ab)
c
3
+
d
3
=
(
c
+
d
)
3
−
3
c
d
(
c
+
d
)
=
(
c
+
d
)
(
c
2
+
d
2
−
c
d
)
c^3+d^3=(c+d)^3-3cd(c+d)=(c+d)(c^2+d^2-cd)
c3+d3=(c+d)3−3cd(c+d)=(c+d)(c2+d2−cd)
∴
m
(
a
+
b
)
(
a
2
+
b
2
−
a
b
)
=
n
(
c
+
d
)
(
c
2
+
d
2
−
c
d
)
\therefore m(a+b)(a^2+b^2-ab)=n(c+d)(c^2+d^2-cd)
∴m(a+b)(a2+b2−ab)=n(c+d)(c2+d2−cd)
等
式
两
边
带
着
系
数
m
,
n
很
不
方
便
,
(
a
2
+
b
2
−
a
b
)
,
(
c
2
+
d
2
−
c
d
)
结
构
较
复
杂
,
等式两边带着系数m,n很不方便,(a^2+b^2-ab),(c^2+d^2-cd)结构较复杂,
等式两边带着系数m,n很不方便,(a2+b2−ab),(c2+d2−cd)结构较复杂,
考
虑
用
(
a
+
b
)
,
(
c
+
d
)
把
m
,
n
消
掉
:
考虑用(a+b),(c+d)把m,n消掉:
考虑用(a+b),(c+d)把m,n消掉:
令
a
+
b
=
k
n
,
c
+
d
=
k
m
令a+b=kn,c+d=km
令a+b=kn,c+d=km
∴
a
2
+
b
2
−
a
b
=
c
2
+
d
2
−
c
d
①
\therefore a^2+b^2-ab=c^2+d^2-cd①
∴a2+b2−ab=c2+d2−cd①
尽
量
让
左
式
出
现
(
a
+
b
)
,
右
式
出
现
(
c
+
d
)
:
尽量让左式出现(a+b),右式出现(c+d):
尽量让左式出现(a+b),右式出现(c+d):
(
a
+
b
)
2
−
3
a
b
=
(
c
+
d
)
2
−
3
c
d
(a+b)^2-3ab=(c+d)^2-3cd
(a+b)2−3ab=(c+d)2−3cd
k
2
n
2
−
3
a
b
=
k
2
m
2
−
3
c
d
k^2n^2-3ab=k^2m^2-3cd
k2n2−3ab=k2m2−3cd
k
2
(
n
2
−
m
2
)
=
3
(
a
b
−
c
d
)
k^2(n^2-m^2)=3(ab-cd)
k2(n2−m2)=3(ab−cd)
考
虑
令
k
=
3
,
构
造
3
(
n
2
−
m
2
)
=
a
b
−
c
d
②
:
考虑令k=3,构造3(n^2-m^2)=ab-cd②:
考虑令k=3,构造3(n2−m2)=ab−cd②:
尝
试
1
:
令
a
b
=
3
n
2
,
c
d
=
3
m
2
,
与
a
+
b
=
3
n
,
c
+
d
=
3
m
联
立
求
解
a
,
b
,
c
,
d
尝试1:令ab=3n^2,cd=3m^2,与a+b=3n,c+d=3m联立求解a,b,c,d
尝试1:令ab=3n2,cd=3m2,与a+b=3n,c+d=3m联立求解a,b,c,d
结
果
:
方
程
无
解
结果:方程无解
结果:方程无解
尝
试
2
:
因
为
已
知
(
a
+
b
)
,
(
c
+
d
)
,
考
虑
求
出
(
a
−
b
)
,
(
c
−
d
)
:
尝试2:因为已知(a+b),(c+d),考虑求出(a-b),(c-d):
尝试2:因为已知(a+b),(c+d),考虑求出(a−b),(c−d):
回
到
①
式
,
让
左
式
出
现
(
a
−
b
)
,
右
式
出
现
(
c
−
d
)
:
回到①式,让左式出现(a-b),右式出现(c-d):
回到①式,让左式出现(a−b),右式出现(c−d):
(
a
−
b
)
2
+
a
b
=
(
c
−
d
)
2
+
c
d
(a-b)^2+ab=(c-d)^2+cd
(a−b)2+ab=(c−d)2+cd
让
此
式
向
②
式
靠
近
:
让此式向②式靠近:
让此式向②式靠近:
(
c
−
d
)
2
−
(
a
−
b
)
2
=
a
b
−
c
d
③
(c-d)^2-(a-b)^2=ab-cd③
(c−d)2−(a−b)2=ab−cd③
②
③
联
立
得
:
②③联立得:
②③联立得:
(
c
−
d
)
2
−
(
a
−
b
)
2
=
3
(
n
2
−
m
2
)
(c-d)^2-(a-b)^2=3(n^2-m^2)
(c−d)2−(a−b)2=3(n2−m2)
令
u
=
c
−
d
,
v
=
a
−
b
令u=c-d,v=a-b
令u=c−d,v=a−b
u
2
−
v
2
=
3
(
n
2
−
m
2
)
u^2-v^2=3(n^2-m^2)
u2−v2=3(n2−m2)
(
u
+
v
)
(
u
−
v
)
=
3
(
n
+
m
)
(
n
−
m
)
(u+v)(u-v)=3(n+m)(n-m)
(u+v)(u−v)=3(n+m)(n−m)
把
3
放
进
其
中
一
个
括
号
中
:
把3放进其中一个括号中:
把3放进其中一个括号中:
(
u
+
v
)
(
u
−
v
)
=
(
n
+
m
)
(
3
n
−
3
m
)
(u+v)(u-v)=(n+m)(3n-3m)
(u+v)(u−v)=(n+m)(3n−3m)
令
u
+
v
=
n
+
m
,
u
−
v
=
3
n
−
3
m
令u+v=n+m,u-v=3n-3m
令u+v=n+m,u−v=3n−3m
解
得
u
=
2
n
−
m
,
v
=
2
m
−
n
解得u=2n-m,v=2m-n
解得u=2n−m,v=2m−n
由
a
+
b
=
3
n
,
a
−
b
=
2
m
−
n
得
a
=
n
+
m
,
b
=
2
n
−
m
由a+b=3n,a-b=2m-n得a=n+m,b=2n-m
由a+b=3n,a−b=2m−n得a=n+m,b=2n−m
由
c
+
d
=
3
m
,
c
−
d
=
2
n
−
m
得
c
=
n
+
m
,
d
=
2
m
−
n
由c+d=3m,c-d=2n-m得c=n+m,d=2m-n
由c+d=3m,c−d=2n−m得c=n+m,d=2m−n
如此,我们便构造出了一组整数解
考虑何时有正整数解:
2
n
−
m
>
0
,
2
m
−
n
>
0
2n-m>0,2m-n>0
2n−m>0,2m−n>0
∴
n
m
∈
(
1
2
,
2
)
时
所
得
为
正
整
数
解
\therefore \frac{n}{m}\in(\frac{1}{2},2)时所得为正整数解
∴mn∈(21,2)时所得为正整数解
若 n m ∉ ( 1 2 , 2 ) \frac{n}{m}\not\in (\frac{1}{2},2) mn∈(21,2),寻找 p 3 n q 3 m ∈ ( 1 2 , 2 ) \frac{p^3n}{q^3m}\in(\frac{1}{2},2) q3mp3n∈(21,2)(令 a , b a,b a,b变为原来的 q q q倍, c , d c,d c,d变为原来的 p p p倍)
为了方便,我们设
n
<
m
n<m
n<m(否则的话swap(n,m)即可)
那么此时必然有
0
<
n
m
<
1
0<\frac{n}{m}<1
0<mn<1
若
n
m
<
1
4
,
n
m
←
2
3
n
m
若\frac{n}{m}<\frac{1}{4},\frac{n}{m}\leftarrow\frac{2^3n}{m}
若mn<41,mn←m23n (保证变化后
n
m
<
2
\frac{n}{m}<2
mn<2)
若
1
4
<
=
n
m
<
=
1
2
,
n
m
←
2
3
n
3
3
m
若\frac{1}{4}<=\frac{n}{m}<=\frac{1}{2},\frac{n}{m}\leftarrow\frac{2^3n}{3^3m}
若41<=mn<=21,mn←33m23n (保证变化后
1
2
<
n
m
<
2
\frac{1}{2}<\frac{n}{m}<2
21<mn<2)
若
n
m
>
1
2
,
保
证
有
正
整
数
解
若\frac{n}{m}>\frac{1}{2},保证有正整数解
若mn>21,保证有正整数解
总结:既然题目只要求一组解,那么就要大胆地作假设来方便自己的运算,大胆地凑答案
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int T,rev;
ll n,m,a,b,c,d,p,q;
void solve(){
rev=0;
p=q=1ll;
if(n>m){
swap(n,m);rev=1;
}
while(4ll*n<m){
p*=2ll;
n*=8ll;
}
if(2ll*n<=m){
p*=3ll;
n*=27ll;
q*=2ll;
m*=8ll;
}
a=q*(n+m);b=q*(2ll*n-m);
c=p*(n+m);d=p*(2ll*m-n);
if(rev) printf("%lld %lld %lld %lld\n",c,d,a,b);
else printf("%lld %lld %lld %lld\n",a,b,c,d);
}
int main(){
scanf("%d",&T);
while(T--){
n=read();m=read();
solve();
}
return 0;
}