首页 > 其他分享 >P9750 [CSP-J 2023] 一元二次方程 题解

P9750 [CSP-J 2023] 一元二次方程 题解

时间:2024-04-10 17:44:45浏览次数:28  
标签:gcd 题解 ll cin flag 一元二次方程 2a CSP cout

题面

直接依照题意模拟即可,注意细节。

细节

第一

注意输出分式时分母为 \(1\) 不输出,分子为 \(0\) 直接输出零且不带正负号。

第二

约分时,\(gcd\) 内的两个数应该都是非负实数。

第三

可以单独输出符号,注意别有多余的符号。

第四

当方程有两根且均是有理数时,要根据 \(2a\) 的正负来判断哪个根最大:当 \(2a>0\) 时,最大的根为 \(\displaystyle \frac{-b+\sqrt{\Delta}}{2a}\),否则应该是 \(\displaystyle \frac{-b-\sqrt{\Delta}}{2a}\)。

第五

注意一下自己的符号有没有打对!!!!无理数部分符号打错了还能有七十分真是奇迹

第六

全输出 \(\text{NO}\) 一分没有(不要想着水分)。

代码

#include<bits/stdc++.h>
#define ll long long
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
inline ll gcd(ll a , ll b)
{
	return b == 0 ? a : gcd(b , a % b);
}
inline ll derta(ll a , ll b , ll c)
{
	return b * b - 4 * a * c;
}
ll T , M , a , b , c;
signed main()
{
//	freopen("data.in" , "r" , stdin);
//	freopen("data.out" , "w" , stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> T >> M;
	while(T--)
	{
		cin >> a >> b >> c;
		if(derta(a , b , c) < 0)//判别式小于零,无解 
		{
			cout << "NO" << '\n';
			continue;
		}
		else if(derta(a , b , c) == 0)//两个有理数根 
		{
			if(b == 0)
			{
				cout << 0 << '\n';
				continue;
			}
			else
			{
				ll ccf = gcd(abs(2 * a) , (abs(-b)));
				if(-b * a < 0)
				{
					cout << "-";
				}
				cout << abs(-b) / ccf;
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
		}
		else
		{
			//x1 = (-b - sqrt(derta(a , b , c))) / (2 * a);
			//x2 = (-b + sqrt(derta(a , b , c))) / (2 * a);
			ll dt = derta(a , b , c);
			ll ccf = gcd(abs(a) , abs(b));
			double sqdt = sqrt(dt);
			if(sqdt - (ll)sqrt(dt) == 0.0)//有理数 
			{
				dt = sqrt(dt);
				ll flag;
				if(2 * a > 0)
				{
					flag = 1;
				}
				else
				{
					flag = -1;
				}
				ccf = gcd(abs(-b + dt * flag) , abs(2 * a));
				if((-b + dt * flag) * a < 0)
				{
					cout << "-";
				}
				cout << abs(-b + dt * flag) / ccf;
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
			else//无理数 
			{
				//有理数部分
				ccf = gcd(abs(-b) , abs(2 * a));
				if(b != 0)
				{
					if(-b * a < 0)
					{
						cout << "-";
					}
					cout << abs(-b) / ccf;
					if(abs(2 * a) / ccf != 1)
					{
						cout << "/" << abs(2 * a) / ccf;
					}
				}
				//无理数部分
				ll cf = dt , w_fz = dt , q2 = 1;
				fo(i , sqrt(M * M * 4) , 1)
				{
					if(cf % (i * i) == 0)
					{
						cf /= i * i;
						w_fz /= i * i;
						q2 = i;
						break;
					}
				}
				ccf = gcd(q2 , abs(2 * a));
				if(a < 0 && b != 0)
				{
					cout << "+";
				}
				else
				{
					if(b != 0 && q2 != 0)
					{
						cout << "+";
					}
				}
				if(q2 / ccf != 1)
				{
					cout << q2 / ccf << "*";
				}
				if(w_fz != 1)
				{
					cout << "sqrt(" << w_fz << ")";
				}
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
		}
	}
 	return 0;
}

标签:gcd,题解,ll,cin,flag,一元二次方程,2a,CSP,cout
From: https://www.cnblogs.com/xhqdmmz/p/18126536

相关文章

  • CF1815A Ian and Array Sorting 题解
    题面。直接进入主题吧。思路题目要求非递减序列,很明显,由题目给的操作,一定可以将这个序列的前\(n-1\)项能够满足是非递减序列,最后只需要比较第\(n\)项是否大于等于第\(n-1\)项即可。解释一下为什么。对于序列\(a\),从\(a_1\)开始到\(a_{n-1}\)结束,每次对\(a_i\)......
  • CF1909C Heavy Intervals 题解
    一种似乎更快抽象的解法?题面正文看这道题,给定序列\(l,r,c\),要求重构\(l,r,c\)使得\(\sum_{i=1}^n(r_i-l_i)\timesc_i\)最小。首先可以想到的就是尽量让小的\(r_i-l_i\)乘上大的\(c_i\)。这样子看来\(c_i\)几乎不需要更多的处理,仅需从小到大(或从大到小)排个序。来......
  • GitHub问题解决新突破,复旦大学MAGIS框架大幅超越GPT-4
    获取本文论文,请关注公众号【AI论文解读】回复:&nbsp;论文解读引言:GitHub问题解决的挑战与LLMs的潜力在软件开发的演进过程中,解决GitHub仓库中出现的问题是一个复杂的挑战。这不仅涉及到新代码的加入,还要维护现有功能的稳定运行。大型语言模型(LLMs)在代码生成和理解方......
  • Air Conditioner 题解
    [AirConditioner]题意简述题目链接。给定一个整数\(n\),每秒钟可以选择使\(n\)增加\(1\)或减少\(1\)或不改变,有\(M\)个询问,对于第\(i\)个询问,给定\(t_i,l_i,r_i\),表示询问在第\(t_i\)秒时,是否有\(n\in[l_i,r_i]\)。如果能满足所有的询问,输出YES,否则输出NO。......
  • Codeforces-182E 题解
    Vasyahasrecentlyboughtsomelandanddecidedtosurrounditwithawoodenfence.Hewenttoacompanycalled"Woodenboard"thatproduceswoodenboardsforfences.Vasyareadinthecatalogofproductsthatthecompanyhasatitsdisposal\(......
  • 20240410每日一题题解
    20240410每日一题题解Problem一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第\(n\)天早上起来一看,只剩下\(1\)个桃子了。请问小猴买了几个桃子?输入一个正整数\(n\),表示天数。输出小猴买了多......
  • 分享30个外贸常见的问题解答
    顶易四月海关众筹活动实时参与人数已达1835,剩余名额不多。33国海关数据仅需300,一年只卖一次,需要续费/新购请抓紧时间!1、客户:我不会再为这笔订单支付更多的费用,也不接受其他条款。外贸人:下周交货期如果你能找得到其他供货商的话,我们很乐意把生产了一半的货送到另外一个供货......
  • 启动应用程序出现ieui.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ieui.dll文件(挑选合适的版本文件)把它放入......
  • 启动应用程序出现inetcomm.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个inetcomm.dll文件(挑选合适的版本文件)把它......
  • el-table(V 2.15.14)在使用树结构表格并且设置align = 'center'后 树结构层级不明显问
    开发中遇到的小问题:如图所示三个层级区分并不明显,用户体验差解决方案:自定义CSS:首先取消此列的align="center"然后插入以下代码(此CSS为更改图示第二列的样式如果是其它列请自己获取样式名称)//标题居中::v-deepth.el-table_1_column_2.is-leaf.el-table__cell{t......