CCPC-Wannafly Winter Camp Day7 D-二次函数

题目描述

给定三个二次函数
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=2a±a24b+4y

所以很显然,只需要把选择y值代入,即可得到不同的x。

第一个问题:需要保证 b 2 − 4 a c + 4 a y > 0 {b^2-4ac+4ay}>0 b24ac+4ay>0方程才有解,但是很可能某两个函数没有一个y值能够保证都有解,也就是说两个二次函数开口朝向不同并且在y轴投影上不重复。但是题目给出了三个二次函数,就保证了存在解。

第二个问题:需要保证 − a ± a 2 − 4 b + 4 y 2 \frac{-a\pm\sqrt{a^2-4b+4y}}{2} 2a±a24b+4y 值是整数,也就需要 a 2 − 4 b + 4 y \sqrt{a^2-4b+4y} a24b+4y 是个整数,而且和a还必须同奇偶性,才能保证最终是整数。所以问题就转化为了找到y值使得 a 1 2 − 4 b 1 + 4 y {a_1^2-4b_1+4y} a124b1+4y, a 2 2 − 4 b 2 + 4 y {a_2^2-4b_2+4y} a224b2+4y同时为一个平方数(以前两个函数为例)。这个问题当然不能穷举,首先设

Δ = a 2 − 4 b \Delta=a^2-4b Δ=a24b

则设 Δ 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) A2B2=(AB)(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| AB,A+B都为 K K K的因子,所以就转换为了找到 ∣ K ∣ |K| K的因子,当然因子也是要符合一定条件的,为保证 A , B A,B AB都是整数,所以 ∣ A − B ∣ , ∣ A + B ∣ |A-B|,|A+B| AB,A+B必须要有相同的奇偶性。即分解 K K K为两数乘积,保证两数具有相同奇偶性,然后算出A,B后还需要判断A,B与a是否具有相同奇偶性。如都具相同奇偶性,则答案就得出了。

#include
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<tmp2))
                {
                   // cout<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;
}

你可能感兴趣的:(题目)