牛客周赛 D-小红的因式分解

原题链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值