【新时代一元二次方程】

什么?你竟然还在对数学作业上的 \((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;
}
posted @ 2024-03-25 21:31  BYR_KKK  阅读(15)  评论(0编辑  收藏  举报