题目描述
给定三个二次函数
f
(
x
)
=
x
2
+
a
1
x
+
b
1
,
g
(
x
)
=
x
2
+
a
2
x
+
b
2
,
h
(
x
)
=
x
2
+
a
3
x
+
b
3
\begin{array}{c} f(x)=x^2 +a_1x+b_1 , g(x)=x^2 +a_2x+b_2 , h(x)=x^2+a_3x+b_3 \end{array}
f(x)=x2+a1x+b1,g(x)=x2+a2x+b2,h(x)=x2+a3x+b3
你需要找三个整数 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3使得 f ( x 1 ) , g ( x 2 ) , h ( x 3 ) f(x_{1}),g(x_{2}),h(x_{3}) f(x1),g(x2),h(x3) 这三个数中至少有两个数相同
输入描述
第一行一个正整数 T 表示数据组数(1≤T≤104)
接下来 T 行,每行三个六个整数 ,保证每个数的绝对值都小于等于 10^4
输出描述
输出 T 行,每行三个整数 要求 ≤10^18
样例输入 1
1
1 1 1 2 1 3
样例输出 1
-2 0 -1
题意
需要找到在不同二次函数上且横坐标不同纵坐标相同的两个整数点,说白了就是找到整数对
(
x
1
,
y
)
,
(
x
2
,
y
)
,
x
1
!
=
x
2
(x_1,y),(x_2,y),x_1!=x_2
(x1,y),(x2,y),x1!=x2,使以下任意式子成立即可
使得
x
1
2
+
a
1
x
+
b
1
=
x
2
2
+
a
2
x
2
+
b
2
x
1
2
+
a
1
x
+
b
1
=
x
2
2
+
a
3
x
2
+
b
3
x
1
2
+
a
2
x
+
b
2
=
x
2
2
+
a
3
x
2
+
b
3
\begin{array}{c} x_1^2 +a_1x+b_1 =x_2^2 +a_2x_2+b_2 \\ x_1^2 +a_1x+b_1 =x_2^2 +a_3x_2+b_3 \\ x_1^2 +a_2x+b_2 =x_2^2 +a_3x_2+b_3 \end{array}
x12+a1x+b1=x22+a2x2+b2x12+a1x+b1=x22+a3x2+b3x12+a2x+b2=x22+a3x2+b3
第一步首先要满足在二次函数上的点(x,y)要是整数, y = x 2 + a x + b y=x^2+ax+b y=x2+ax+b,可见由整数x得到的y必然也是整数,但是要满足的是y值相等,所以写为反函数形式 x = − a ± a 2 − 4 b + 4 y 2 x=\frac{-a\pm\sqrt{a^2-4b+4y}}{2} x=2−a±a2−4b+4y
所以很显然,只需要把选择y值代入,即可得到不同的x。
第一个问题:需要保证 b 2 − 4 a c + 4 a y > 0 {b^2-4ac+4ay}>0 b2−4ac+4ay>0方程才有解,但是很可能某两个函数没有一个y值能够保证都有解,也就是说两个二次函数开口朝向不同并且在y轴投影上不重复。但是题目给出了三个二次函数,就保证了存在解。
第二个问题:需要保证 − a ± a 2 − 4 b + 4 y 2 \frac{-a\pm\sqrt{a^2-4b+4y}}{2} 2−a±a2−4b+4y值是整数,也就需要 a 2 − 4 b + 4 y \sqrt{a^2-4b+4y} a2−4b+4y是个整数,而且和a还必须同奇偶性,才能保证最终是整数。所以问题就转化为了找到y值使得 a 1 2 − 4 b 1 + 4 y {a_1^2-4b_1+4y} a12−4b1+4y, a 2 2 − 4 b 2 + 4 y {a_2^2-4b_2+4y} a22−4b2+4y同时为一个平方数(以前两个函数为例)。这个问题当然不能穷举,首先设
Δ = a 2 − 4 b \Delta=a^2-4b Δ=a2−4b
则设
Δ
1
+
4
y
=
A
2
,
Δ
2
+
4
y
=
B
2
{\Delta_1+4y}=A^2,{\Delta_2+4y}=B^2
Δ1+4y=A2,Δ2+4y=B2
我们知道平方差公式
A
2
−
B
2
=
(
A
−
B
)
(
A
+
B
)
=
Δ
1
−
Δ
2
=
K
⋯
⋯
(
1
)
A^2-B^2=(A-B)(A+B)=\Delta_1-\Delta_2=K\cdots\cdots(1)
A2−B2=(A−B)(A+B)=Δ1−Δ2=K⋯⋯(1)
因为
Δ
1
,
Δ
2
\Delta_1,\Delta_2
Δ1,Δ2都是已知的,所以
K
K
K值可直接算出,由(1)式可知,
∣
A
−
B
∣
,
∣
A
+
B
∣
|A-B|,|A+B|
∣A−B∣,∣A+B∣都为
K
K
K的因子,所以就转换为了找到
∣
K
∣
|K|
∣K∣的因子,当然因子也是要符合一定条件的,为保证
A
,
B
A,B
A,B都是整数,所以
∣
A
−
B
∣
,
∣
A
+
B
∣
|A-B|,|A+B|
∣A−B∣,∣A+B∣必须要有相同的奇偶性。即分解
K
K
K为两数乘积,保证两数具有相同奇偶性,然后算出A,B后还需要判断A,B与a是否具有相同奇偶性。如都具相同奇偶性,则答案就得出了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mmax=1e4+1000;
int a[3][2];
//ll in[mmax];
ll ans[3];
ll x,y;
bool judge(int a,int a1,int a2,int flag)
{
int kk=sqrt(a);
for(int i=1; i<=kk; i++)
{
if(a%i==0)
{
if((a/i+i)%2==0)
{
x=(a/i+i)/2;
y=(a/i-i)/2;
//cout<<x<<" "<<y<<"??"<<a1<<" "<<a2<<endl;
if(flag&&(x-a1)%2==0&&(y-a2)%2==0)
return 1;
else if(flag==0&&(y-a1)%2==0&&(x-a2)%2==0)
return 1;
}
}
}
return 0;
}
int main()
{
//for(int i=0; i<mmax; i++)
// in[i]=i*i;
int t;
scanf("%d",&t);
ll tmp1,tmp2;
while(t--)
{
int flag=0;
memset(ans,0,sizeof(ans));
for(int i=0; i<3; i++)
{
// a[i][0]=rand()%1000;
//a[i][1]=rand()%1000;
// cout<<a[i][0]<<" "<<a[i][1]<<" ";
scanf("%d%d",&a[i][0],&a[i][1]);
}
//cout<<endl;
for(int i=0; i<3; i++)
{
for(int j=i+1; j<3; j++)
{
tmp1=a[i][0]*a[i][0]-4*a[i][1];
tmp2=a[j][0]*a[j][0]-4*a[j][1];
if(tmp1==tmp2)
{
//cout<<"???"<<endl;
if(tmp1<0)tmp1=0;
ll kk=(ll)sqrt(tmp1)+1;
if((kk-a[i][0])%2==0&&(kk-a[j][0])%2==0)
{
ans[i]=(kk-a[i][0])/2;
ans[j]=(kk-a[j][0])/2;
flag=1;
}
else if((kk-a[i][0]+1)%2==0&&(kk-a[j][0]+1)%2==0)
{
ans[i]=(kk-a[i][0]+1)/2;
ans[j]=(kk-a[j][0]+1)/2;
flag=1;
}
break;
}
if(judge(max(tmp1-tmp2,tmp2-tmp1),a[i][0],a[j][0],tmp1>tmp2))
{
// cout<<max(tmp1-tmp2,tmp2-tmp1)<<" "<<x<<" "<<y<< endl;
if(tmp1>tmp2)
{
ans[i]=(x-a[i][0])/2;
ans[j]=(y-a[j][0])/2;
}
else
{
ans[i]=(y-a[i][0])/2;
ans[j]=(x-a[j][0])/2;
}
flag=1;
break;
}
}
if(flag)
break;
}
printf("%lld %lld %lld\n",ans[0],ans[1],ans[2]);
}
return 0;
}