NC15992. 因式分解2
描述
输入描述
输入的第一行有一个正整数 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; }