列表

详情


NC15992. 因式分解2

描述

dreamoon初中时最喜欢在上数学课时睡觉了,每次睡觉时,都会被老师罚解很多道整系数一元二次多项式因式分解成两个整系数一元一次多项式相乘的题目,但dreamoon很狡猾,写了一个能解因式分解的程序,故这个惩罚对dreamoon没什么大不了的。

身为dreamoon粉丝的你,也想效法dreamoon(能够写出解因式分解的程序的部份),现在就来测试看看你写的程序是否正确吧〜

至于你应该要输出什么,详情请参考标准输出。

输入描述

输入的第一行有一个正整数 T,代表该笔测试资料含有多少组因式分解问题。
接下来有 T 行,每个询问各占 1 行,包含 3 个整数 a, b, c,代表这个询问要你对 a·x2+ b·x +c 做因式分解。

输出描述

对于每个因式分解问题,若有多种把a·x2 + b·x +c 分解成两个整系数一元一次多项式相乘,也就是形如(s·x + t) x (u·x + v) 的方式,请找到使得s·101000+ t·10100 + u·1010 + v 最大的一组解,并输出四个整数s, t, u, v 于一行。
若无法因式分解,则输仍然输出三个整数 a, b, c 于一行。

示例1

输入:

3
5 1 -4
5 1 4
5 0 0

输出:

5 -4 1 1
5 1 4
5 0 1 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 74ms, 内存消耗: 2012K, 提交时间: 2018-08-08 19:55:36

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
void solve()
{
    ll a,b,c;scanf("%lld%lld%lld",&a,&b,&c);
    ll deta=b*b-4*a*c;
    if(deta<0)
    {
        printf("%lld %lld %lld\n",a,b,c);return;
    }
    ll sqr=deta;
    deta=(ll)sqrt(deta);
    if(sqr!=deta*deta){
            printf("%lld %lld %lld\n",a,b,c);return;
    }
    ll s=2*a,t=b+deta;
    ll u=2*a,v=b-deta;
    ll gcd1=gcd(s,t),gcd2=gcd(u,v);
    s/=gcd1;t/=gcd1;u/=gcd2;v/=gcd2;
    ll M=gcd1*gcd2/4/a;
    if(s<0){s*=-1;t*=-1;M*=-1;}
    if(u<0){u*=-1;v*=-1;M*=-1;}
    if(s<u){swap(s,u);swap(t,v);}
    else if(s==u&&t<v)swap(t,v);
    if(M<0){M*=-1;u*=-1;v*=-1;}
    s*=M;t*=M;
    printf("%lld %lld %lld %lld\n",s,t,u,v);
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)solve();
    return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 241ms, 内存消耗: 3472K, 提交时间: 2022-11-19 13:01:01

#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    int a,b,c;
    cin>>a>>b>>c;   
    int res=b*b-4*a*c;
    if(res<0){cout<<a<<" "<<b<<" "<<c<<endl;return;}
    
    int res1=sqrt(res);
    if(res1*res1!=res){cout<<a<<" "<<b<<" "<<c<<endl;return;}
    int s=2*a,t=b+res1;
    int u=2*a,v=b-res1;
    int g=__gcd(abs(s),abs(t));
    s/=g,t/=g;
    g=__gcd(abs(u),abs(v));
    u/=g,v/=g;
    if(s<0)    s=-s,t=-t;
    if(u<0)    u=-u,v=-v;
    
    if(a % (s*u)!=0){cout<<a<<" "<<b<<" "<<c<<endl;return;}
    a/=s;
    a/=u;
    if(s<u || (s==u && t<v))    swap(s,u),swap(t,v);
    s*=abs(a);
    t*=abs(a);
    if(a<0)    u=-u,v=-v;
    cout<<s<<" "<<t<<" "<<u<<" "<<v<<endl;
    return ;
}
    
signed main()
{
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 84ms, 内存消耗: 3448K, 提交时间: 2018-10-09 13:52:35

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
	return b?gcd(b,a%b):a;
} 
int T,a,b,c;
ll u,v,s,t;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&a,&b,&c);
		ll d=1ll*b*b-4ll*a*c,e=0;
		if(d>=0)e=(ll)sqrt(d);
		while(e*e<d)e++;
		if(e*e!=d)printf("%d %d %d\n",a,b,c);
		else
		{
			t=b+e,v=b-e,s=u=2*a;
			ll g=gcd(abs(s),abs(t));
			s/=g,t/=g;
			g=gcd(abs(u),abs(v));
			u/=g,v/=g;
			if(s<0)s=-s,t=-t;
			if(u<0)u=-u,v=-v;
			if(a%((ll)s*u)!=0)printf("%d %d %d\n",a,b,c);
			else
			{
				a/=s,a/=u;
				if(s<u||s==u&&t<v)swap(s,u),swap(t,v);
				s*=abs(a),t*=abs(a);
				if(a<0)u=-u,v=-v;
				printf("%lld %lld %lld %lld\n",s,t,u,v);
			}
		}
	}
	return 0;
}

上一题