【新时代一元二次方程】
什么?你竟然还在对数学作业上的 \((ax+b)(cx+d)=e\) 形式的方程感到头疼???
根据 lmx 第一定律(不知道没关系,毕竟是我们班同学),令 \(x_0,x_1\) 为 \((ax+b)(cx+d)=0\) 的两根,则 \((ax+b)(cx+d)=ac(x-x_0)(x-x_1)\)。
即 \(ac(x-x_0)(x-x_1)=e\),得到 \(x^2-(x_0+x_1)x+x_0x_1=\frac{e}{ac}\),容易求解。
撒花。
代码写的太抽象了,还不对。
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pii std::pair<int,int>
#define piF std::pair<F,F>
void read(int &a){
char c=getchar();
int f=1;
a=0;
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') a=a*10+(int)(c-'0'),c=getchar();
a*=f;
return ;
}
template<typename T,typename I>
void chkmax(T &a,I b){
a=std::max(a,b);
}
template<typename T,typename I>
void chkmin(T &a,I b){
a=std::min(a,b);
}
struct F{
int fm,fz;
};
int a,b,c,d,e;
std::map<int,bool>mp;
piF get(int a,int b,int c,int d){
return {{a,-b},{c,-d}};
}
int my_abs(int x){
return x<0 ? -x : x;
}
namespace FEN{
void yf(F &s){
int d=std::__gcd(my_abs(s.fz),my_abs(s.fm));
s.fm/=d,s.fz/=d;
return ;
}
F plus(F s1,F s2){
int d=std::__gcd(s1.fm,s2.fm);
F ans={d,s1.fz*(d/s1.fm)+s2.fz*(d/s2.fm)};
yf(ans);
return ans;
}
F nlus(F s1,F s2){
F ans={s1.fm*s2.fm,s1.fz*s2.fz};
yf(ans);
return ans;
}
F sqrt(F s){
if(s.fz==0) return {s.fm,0};
if((!mp[s.fz])||(!mp[s.fm])) return {-114514,1919810};
return {mp[s.fm],mp[s.fz]};
}
F ksm(F s,int y){
if(y==0) return yf(s),1;
F z=ksm(s,y>>1);
z=nlus(z,z);
if(y&1) z=nlus(z,s);
return z;
}
F check(F s1,F s2){
int d=std::__gcd(my_abs(s1.fm),my_abs(s2.fm));
if(s1.fz*(d/s1.fm)>s2.fz*(d/s2.fm)) return s1;
return s2;
}
bool same(F s1,F s2){
yf(s1),yf(s2);
if(s1.fm<0) s1.fm=my_abs(s1.fm),s1.fz*=-1;
if(s2.fm<0) s2.fm=my_abs(s2.fm),s2.fz*=-1;
if(s1.fm==s2.fm&&s1.fz==s2.fz) return 1;
return 0;
}
void print(F s){
yf(s);
if(s.fm<0) s.fm=my_abs(s.fm),s.fz*=-1;
if(s.fz==0) {
putchar('0');
return ;
}
if(s.fm==1){
printf("%lld",s.fz);
return ;
}
printf("%lld/%lld,其近似值为 %.5f",s.fz,s.fm,(s.fz*1.0)/(s.fm*(1.0)));
return ;
}
}
using namespace FEN;
void init(){
for(int i=0;i<=(int)1e5;i++) mp[i*i]=i;
return ;
}
piF solve(F a,F b,F c){
F del=plus(ksm(b,2),nlus({1,-4},nlus(a,c)));
if(!same(check(del,{del.fm,0}),del)) return printf("NO"),{{-114514,114514},{-1919810,1919810}};
F x1,x2;
x1={nlus({1,2},a),plus(nlus({1,-1},b),del)},x2=plus(x1,nlus({1,-2},del));
yf(x1),yf(x2);
return {x1,x2};
}
signed main(){
init();
while(1){
read(a),read(b),read(c),read(d),read(e);
F x0=get(a,b,c,d).fi,x1=get(a,b,c,d).se;
yf(x0),yf(x1);
F w={a*c,e};
yf(w);
F A={1,1},B=nplus({1,-1},plus(x0,x1)),C=plus(nlus(x0,x1),nlus(w,{1,-1})));
F x1=solve(A,B,C).fi,x2=solve(A,B,C).se;
print(x1);
putchar('\n');
print(x2);
printf("\n\n");
}
return 0;
}