原题链接:D-小红的因式分解
题目大意:思路:
暴力:因为数据最多只有100组,并且a和c的最大范围就是1e6,那么可以直接暴力枚举a和c的因子然后如果可以计算出b,就是可以表示.
数学:先利用求根公式来计算出二个根的值,然后凑出的4个数就可以。
//冷静,冷静,冷静
//调不出来就重构
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=1000000007;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
srand(time(0));
ll t;cin>>t;
while(t--)
{
ll a,b,c;cin>>a>>b>>c;
ll k=abs(a),v=abs(c);
bool st=0;
for(int i=1;i<=k/i;i++)
{
if(st)break;
if(k%i==0)
{
ll zb=i,yb=a/i;
if(c==0)
{
if(b==0)
{
cout<<zb<<' '<<0<<' '<<yb<<' '<<0<<endl;
st=1;
break;
}
else
{
if(b%zb==0)
{
cout<<yb<<' '<<b/zb<<' '<<zb<<' '<<0<<endl;
st=1;
break;
}
if(b%yb==0)
{
cout<<zb<<' '<<b/yb<<' '<<yb<<' '<<0<<endl;
st=1;
break;
}
}
}
else
{
for(int j=1;j<=v/j;j++)
{
if(v%j==0)
{
ll z=j,y=c/j;
if(zb*y+yb*z==b)
{
cout<<zb<<' '<<z<<' '<<yb<<' '<<y<<endl;
st=1;
break;
}
if(zb*z+yb*y==b)
{
cout<<zb<<' '<<y<<' '<<yb<<' '<<z<<endl;
st=1;
break;
}
zb=-zb,yb=-yb;
if(zb*y+yb*z==b)
{
cout<<zb<<' '<<z<<' '<<yb<<' '<<y<<endl;
st=1;
break;
}
if(zb*z+yb*y==b)
{
cout<<zb<<' '<<y<<' '<<yb<<' '<<z<<endl;
st=1;
break;
}
}
}
}
}
}
if(!st)cout<<"NO"<<endl;
}
return 0;
}
//冷静,冷静,冷静
//调不出来就重构
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=998244353;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll t;cin>>t;
while(t--)
{
ll a,b,c;cin>>a>>b>>c;
ll d=b*b-4*a*c;
if(d<0)
{
cout<<"NO"<<endl;
continue;
}
ll v=sqrt(d);
if(v*v-d)
{
cout<<"NO"<<endl;
continue;
}
ll fz1=-b-v,fm1=2*a,fz2=-b+v,fm2=2*a;
ll g1=__gcd(fz1,fm1),g2=__gcd(fz2,fm2);
fz1/=g1,fm1/=g1,fz2/=g2,fm2/=g2;
ll vb=a/fm1/fm2;
cout<<fm1*vb<<' '<<-fz1*vb<<' '<<fm2<<' '<<-fz2<<endl;
}
return 0;
}