CSP-J 2023 T3 一元二次方程

文章目录

  • 题目
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • 题目传送门
  • 题解
    • 思路
    • 总代码
  • 提交结果
  • 尾声

题目

题目背景

众所周知,对一元二次方程 a x 2 + b x + c = 0 , ( a ≠ 0 ) ax ^ 2 + bx + c = 0, (a \neq 0) ax2+bx+c=0,(a=0),可以用以下方式求实数解:

  • 计算 Δ = b 2 − 4 a c \Delta = b ^ 2 - 4ac Δ=b24ac,则:
    1. Δ < 0 \Delta < 0 Δ<0,则该一元二次方程无实数解。
    2. 否则 Δ ≥ 0 \Delta \geq 0 Δ0,此时该一元二次方程有两个实数解 x 1 , 2 = − b ± Δ 2 a x _ {1, 2} = \frac{-b \pm \sqrt \Delta}{2a} x1,2=2ab±Δ

例如:

  • x 2 + x + 1 = 0 x ^ 2 + x + 1 = 0 x2+x+1=0 无实数解,因为 Δ = 1 2 − 4 × 1 × 1 = − 3 < 0 \Delta = 1 ^ 2 - 4 \times 1 \times 1 = -3 < 0 Δ=124×1×1=3<0
  • x 2 − 2 x + 1 = 0 x ^ 2 - 2x + 1 = 0 x22x+1=0 有两相等实数解 x 1 , 2 = 1 x _ {1, 2} = 1 x1,2=1
  • x 2 − 3 x + 2 = 0 x ^ 2 - 3x + 2 = 0 x23x+2=0 有两互异实数解 x 1 = 1 , x 2 = 2 x _ 1 = 1, x _ 2 = 2 x1=1,x2=2

在题面描述中 a a a b b b 的最大公因数使用 gcd ⁡ ( a , b ) \gcd(a, b) gcd(a,b) 表示。例如 12 12 12 18 18 18 的最大公因数是 6 6 6,即 gcd ⁡ ( 12 , 18 ) = 6 \gcd(12, 18) = 6 gcd(12,18)=6

题目描述

现在给定一个一元二次方程的系数 a , b , c a, b, c a,b,c,其中 a , b , c a, b, c a,b,c 均为整数且 a ≠ 0 a \neq 0 a=0。你需要判断一元二次方程 a x 2 + b x + c = 0 a x ^ 2 + bx + c = 0 ax2+bx+c=0 是否有实数解,并按要求的格式输出。

在本题中输出有理数 v v v 时须遵循以下规则:

  • 由有理数的定义,存在唯一的两个整数 p p p q q q,满足 q > 0 q > 0 q>0 gcd ⁡ ( p , q ) = 1 \gcd(p, q) = 1 gcd(p,q)=1 v = p q v = \frac pq v=qp

  • q = 1 q = 1 q=1则输出 {p},否则输出 {p}/{q},其中 {n} 代表整数 n n n 的值;

  • 例如:

    • v = − 0.5 v = -0.5 v=0.5 时, p p p q q q 的值分别为 − 1 -1 1 2 2 2,则应输出 -1/2
    • v = 0 v = 0 v=0 时, p p p q q q 的值分别为 0 0 0 1 1 1,则应输出 0

对于方程的求解,分两种情况讨论:

  1. Δ = b 2 − 4 a c < 0 \Delta = b ^ 2 - 4ac < 0 Δ=b24ac<0,则表明方程无实数解,此时你应当输出 NO

  2. 否则 Δ ≥ 0 \Delta \geq 0 Δ0,此时方程有两解(可能相等),记其中较大者为 x x x,则:

    1. x x x 为有理数,则按有理数的格式输出 x x x

    2. 否则根据上文公式, x x x 可以被唯一表示为 x = q 1 + q 2 r x = q _ 1 + q _ 2 \sqrt r x=q1+q2r 的形式,其中:

      • q 1 , q 2 q _ 1, q _ 2 q1,q2 为有理数,且 q 2 > 0 q _ 2 > 0 q2>0
      • r r r 为正整数且 r > 1 r > 1 r>1,且不存在正整数 d > 1 d > 1 d>1 使 d 2 ∣ r d ^ 2 \mid r d2r(即 r r r 不应是 d 2 d ^ 2 d2 的倍数);

    此时:

    1. q 1 ≠ 0 q _ 1 \neq 0 q1=0,则按有理数的格式输出 q 1 q _ 1 q1,并再输出一个加号 +
    2. 否则跳过这一步输出;

    随后:

    1. q 2 = 1 q _ 2 = 1 q2=1,则输出 sqrt({r})
    2. 否则若 q 2 q _ 2 q2 为整数,则输出 {q2}*sqrt({r})
    3. 否则若 q 3 = 1 q 2 q _ 3 = \frac 1{q _ 2} q3=q21 为整数,则输出 sqrt({r})/{q3}
    4. 否则可以证明存在唯一整数 c , d c, d c,d 满足 c , d > 1 , gcd ⁡ ( c , d ) = 1 c, d > 1, \gcd(c, d) = 1 c,d>1,gcd(c,d)=1 q 2 = c d q _ 2 = \frac cd q2=dc,此时输出 {c}*sqrt({r})/{d}

    上述表示中 {n} 代表整数 {n} 的值,详见样例。

    如果方程有实数解,则按要求的格式输出两个实数解中的较大者。否则若方程没有实数解,则输出 NO

输入格式

输入的第一行包含两个正整数 T , M T, M T,M,分别表示方程数和系数的绝对值上限。

接下来 T T T 行,每行包含三个整数 a , b , c a, b, c a,b,c

输出格式

输出 T T T 行,每行包含一个字符串,表示对应询问的答案,格式如题面所述。

每行输出的字符串中间不应包含任何空格

样例 #1

样例输入 #1

9 1000
1 -1 0
-1 -1 -1
1 -2 1
1 5 4
4 4 1
1 0 -432
1 -3 1
2 -4 1
1 7 1

样例输出 #1

1
NO
1
-1
-1/2
12*sqrt(3)
3/2+sqrt(5)/2
1+sqrt(2)/2
-7/2+3*sqrt(5)/2

提示

【样例 #2】

见附件中的 uqe/uqe2.inuqe/uqe2.ans

【数据范围】

对于所有数据有: 1 ≤ T ≤ 5000 1 \leq T \leq 5000 1T5000 1 ≤ M ≤ 1 0 3 1 \leq M \leq 10 ^ 3 1M103 ∣ a ∣ , ∣ b ∣ , ∣ c ∣ ≤ M |a|,|b|,|c| \leq M a,b,cM a ≠ 0 a \neq 0 a=0

测试点编号 M ≤ M \leq M特殊性质 A特殊性质 B特殊性质 C
1 1 1 1 1 1
2 2 2 20 20 20
3 3 3 1 0 3 10 ^ 3 103
4 4 4 1 0 3 10 ^ 3 103
5 5 5 1 0 3 10 ^ 3 103
6 6 6 1 0 3 10 ^ 3 103
7 , 8 7, 8 7,8 1 0 3 10 ^ 3 103
9 , 10 9, 10 9,10 1 0 3 10 ^ 3 103

其中:

  • 特殊性质 A:保证 b = 0 b = 0 b=0
  • 特殊性质 B:保证 c = 0 c = 0 c=0
  • 特殊性质 C:如果方程有解,那么方程的两个解都是整数。

题目传送门

洛谷 P9750 [CSP-J 2023] 一元二次方程

题解

思路

没有任何算法,纯粹的大模拟,细节还蛮多的

由于这道题有多测,所以用一个函数比较好,可以把 a , b , c a,b,c a,b,c 都传进去,这就是主函数

int T, m;
int a, b, c;
int main() {scanf("%d%d", &T, &m);while(T-- && scanf("%d%d%d", &a, &b, &c))work(a, b, c);return 0;
}

函数里面首先是判断无解,也就是 Δ < 0 \Delta<0 Δ<0,那我们就需要算出 Δ \Delta Δ,即 b 2 − 4 a c b^2-4ac b24ac

int delta = b * b - 4 * a * c;void work(int a, int b, int c) {delta = b * b - 4 * a * c;if(delta < 0) {puts("NO");return;}
}

然后需要判断 Δ \Delta Δ 是完全平方数,那么就可以直接算出 − b + Δ 2 a \frac{-b+\sqrt\Delta}{2a} 2ab+Δ − b − Δ 2 a \frac{-b-\sqrt\Delta}{2a} 2abΔ 哪个大,然后如果能除开就直接输出那个根,否则就输出约分后的那个根

(那个 p r i n t d i v i s i o n ( p , q ) printdivision(p,q) printdivision(p,q) 函数是用来输出 p / q p/q p/q 的,具体请参考注释)

int delta;
double x1, x2;
int sq;void print_division(int p, int q) {if(!p) {											// 分子为 0,则输出 0 putchar('0');return;}if(p * q < 0)										// 两数异号,则输出符号 putchar('-');if(p < 0)											// 将两数都变成正数 p = -p;if(q < 0)q = -q;int g = __gcd(p, q);								// 约分 p /= g;q /= g;if(q == 1)											// 分母为 1,则输出分子 printf("%d", p);else												// 否则输出 “分子/分母” printf("%d/%d", p, q);
}void work(int a, int b, int c) {delta = b * b - 4 * a * c;if(delta < 0) {puts("NO");return;}sq = sqrt(delta);if(sq * sq == delta) {x1 = 1.0 * (-b + sq) / 2 * a;x2 = 1.0 * (-b - sq) / 2 * a;if(x1 > x2)print_division(-b + sq, 2 * a);elseprint_division(-b - sq, 2 * a);puts("");return;}
}

否则的话就需要按照 “ − b / 2 a + Δ / 2 a -b/2a+\sqrt\Delta/2a b/2a+Δ /2a” 的格式输出

首先如果 b ≠ 0 b\neq0 b=0,那么就说明 − b / 2 a ≠ 0 -b/2a\neq0 b/2a=0,就可以输出 “ − b / 2 a + -b/2a+ b/2a+

为什么一定是 + + + ?因为如果是 − b − Δ 2 a \frac{-b-\sqrt\Delta}{2a} 2abΔ 更大,那就说明 2 a < 0 2a<0 2a<0,否则不可能 − b − Δ 2 a > − b − Δ 2 a \frac{-b-\sqrt\Delta}{2a}>\frac{-b-\sqrt\Delta}{2a} 2abΔ >2abΔ ,所以一定是 + + +

最后就是输出 Δ / 2 a \sqrt\Delta/2a Δ /2a 了,具体怎么做请参考代码注释

int delta;
double x1, x2;
int sq;void print_division(int p, int q) {if(!p) {											// 分子为 0,则输出 0 putchar('0');return;}if(p * q < 0)										// 两数异号,则输出符号 putchar('-');if(p < 0)											// 将两数都变成正数 p = -p;if(q < 0)q = -q;int g = __gcd(p, q);								// 约分 p /= g;q /= g;if(q == 1)											// 分母为 1,则输出分子 printf("%d", p);else												// 否则输出 “分子/分母” printf("%d/%d", p, q);
}void print_sqrt(int p, int q) {if(q < 0)											// 如果分母是负数,则将其变为正数,因为和前面的负号消没了(上文说过了) q = -q;int u = 1;											// 根号前面的系数 for(int i = sqrt(p); i > 1; --i)					// 化简 if(!(p % (i * i))) {p /= i * i;u *= i;break; }int g = __gcd(u, q);								// 约分 u /= g;q /= g;if(u > 1)											// 系数大于 1,则输出 “系数*” printf("%d*", u);if(p > 1)											// 根号下的数大于 1,则输出 “sqrt(根号下的数)” printf("sqrt(%d)", p);if(q > 1)											// 分母大于 1,则输出 “/分母” printf("/%d", q);
}void work(int a, int b, int c) {delta = b * b - 4 * a * c;if(delta < 0) {puts("NO");return;}sq = sqrt(delta);if(sq * sq == delta) {x1 = 1.0 * (-b + sq) / 2 * a;x2 = 1.0 * (-b - sq) / 2 * a;if(x1 > x2)print_division(-b + sq, 2 * a);elseprint_division(-b - sq, 2 * a);puts("");return;}if(b) {print_division(-b, 2 * a);putchar('+');}print_sqrt(delta, 2 * a);puts("");
}

总代码

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;int T, m;
int a, b, c;
int delta;
double x1, x2;
int sq;void print_division(int p, int q) {if(!p) {putchar('0');return;}if(p * q < 0)putchar('-');if(p < 0)p = -p;if(q < 0)q = -q;int g = __gcd(p, q);p /= g;q /= g;if(q == 1)printf("%d", p);elseprintf("%d/%d", p, q);
}void print_sqrt(int p, int q) {if(q < 0)q = -q;int u = 1;for(int i = sqrt(p); i > 1; --i)if(!(p % (i * i))) {p /= i * i;u *= i;break; }int g = __gcd(u, q);u /= g;q /= g;if(u > 1)printf("%d*", u);if(p > 1)printf("sqrt(%d)", p);if(q > 1)printf("/%d", q);
}void work(int a, int b, int c) {delta = b * b - 4 * a * c;if(delta < 0) {puts("NO");return;}sq = sqrt(delta);if(sq * sq == delta) {x1 = 1.0 * (-b + sq) / 2 * a;x2 = 1.0 * (-b - sq) / 2 * a;if(x1 > x2)print_division(-b + sq, 2 * a);elseprint_division(-b - sq, 2 * a);puts("");return;}if(b) {print_division(-b, 2 * a);putchar('+');}print_sqrt(delta, 2 * a);puts("");
}int main() {scanf("%d%d", &T, &m);while(T-- && scanf("%d%d%d", &a, &b, &c))work(a, b, c);return 0;
}

提交结果

戳这里看我的提交记录
提交结果

尾声

如果这篇题解对您(或您的团队)有帮助的话,就帮忙点个赞,加个关注!

最后,祝您(或您的团队)在 OI 的路上一路顺风!!!

┬┴┬┴┤・ω・)ノ Bye~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803873.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++种pair的初始化及与unordered_map的区别

pair的初始化及与unordered_map的区别 概述pair初始化开发环境头文件示例运行结果 与unordered_map的区别 概述 本文旨在介绍pair初始化&#xff0c;同时简述pair与unordered_map的区别。 pair初始化 pair是一个模板类&#xff0c;可以存储两个类型的数据为一个对象。 开发…

零基础备考PMP,需要多长时间?

PMP是一门专业性很强的项目管理知识&#xff0c;考试当然是有一定的难度&#xff0c;但是也没有难到让你怀疑人生的程度。 如果你在学习PMP之前&#xff0c;已经有一些经验&#xff0c;那么备考一个半月基本上是没多大问题的&#xff0c;如果你是零基础小白&#xff0c;那么备…

微信小程序开发 基本学习(了解和认识)

目录 一、小程序简介 二、注册小程序账号 安装微信发者工具 三、创建小程序项目 四、项目结构 1.了解项目的基本组成结构 2.小程序页面的组成结构 3.新建小程序页面 4.修改项目首页 5.WXML模板 5.1什么是WXML 5.2WXML和HTML的区别 6.WXSS样式 6.1什么是WXSS 6.2.W…

Flutter GLSL - 肆 | 从条纹到马赛克

theme: cyanosis Flutter & GLSL 系列文章&#xff1a; 《Flutter & GLSL - 壹 | Shader 让绘制无限强大》《Flutter & GLSL - 贰 | 从坐标到颜色》《Flutter & GLSL - 叁 | 变量传参》《Flutter & GLSL - 肆 | 从条纹到马赛克》 案例代码开源地址 【skele…

微服务篇之分布式系统理论

一、CAP定理 1.什么是CAP 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 1. Consistency&#xff08;一致性&#xff09;。 2. Availability&#xff08;可用性&#xff09;。 3. Partition tolerance &#xff0…

高级语言期末2013级A卷

1.对长度为n的整型数组a进行冒泡排序 #include <stdio.h>void sort(int *a,int n) {for(int i0; i<n-1; i)for(int j0; j<n-i-1; j)if(a[j]>a[j1]) {int tempa[j];a[j]a[j1];a[j1]temp;} } 2.编写函数&#xff0c;实现按照如下公式计算的功能 #include <st…

挑战30天学完Python:Day18 正则表达式

&#x1f4d8; Day 18 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…

【ArcGIS】利用高程进行坡度分析

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操参考 坡度 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数法、密位法和分数法四种&#xff0c;其中以百分比法和度数法较为常用。 &#xff08;1&#…

Stable Diffusion 3 Early Preview发布

2月22日&#xff0c;Stability AI 发布了 Stable Diffusion 3 early preview&#xff0c;这是一种开放权重的下一代图像合成模型。据报道&#xff0c;它继承了其前身&#xff0c;生成了详细的多主题图像&#xff0c;并提高了文本生成的质量和准确性。这一简短的公告并未附带公开…

通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试

mydev.c #include <linux/init.h> #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h>// 创建功能码 #define LED_ON _IO(l, 1) #d…

Leetcode3035. 回文字符串的最大数量

Every day a Leetcode 题目来源&#xff1a;3035. 回文字符串的最大数量 解法1&#xff1a;哈希 排序 由于可以随意交换字母&#xff0c;先把所有字母都取出来&#xff0c;然后考虑如何填入各个字符串。 如果一个奇数长度字符串最终是回文串&#xff0c;那么它正中间的那…

(十八)devops持续集成开发——使用docker安装部署jenkins流水线服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins&#xff0c;选择一个最新稳定版本&#xff0c;避免一些插件不兼…

【某机构vip教程】Requests(6):Requests模块_超时设置

超时设置 Requests模块可以设置接收数据的超时时间&#xff0c;超出设定的时间还没有数据返回&#xff0c;就抛出异常。超时设 置有两种类型表达&#xff1a;float 、tuple timeout():以秒为单位 如果远端服务器很慢&#xff0c;你可以让 Request 永远等待&#xff0c;传入一…

ApexRBp在线粒子传感器在电动汽车电池制造的应用

电动汽车电池的崛起与颗粒污染的挑战 随着电动汽车&#xff08;EV&#xff09;市场的迅速扩张&#xff0c;对高性能锂离子电池的需求也急剧增加。这些电池不仅是EV的心脏&#xff0c;更是推动其前行的核心动力。然而&#xff0c;在电池制造的每一个环节&#xff0c;都需要对多…

【总第49篇】2.3深度学习开发任务实例(2)机器学习和深度学习的对比【大厂AI课学习笔记】

机器学习和深度学习都是用于图片分类任务的强大工具&#xff0c;但它们采用的方法和原理有所不同。下面我将分别解释这两种技术是如何应用于图片分类的&#xff0c;并着重讨论深度学习中的卷积概念。 机器学习在图片分类中的应用 传统的机器学习方法在进行图片分类时&#xf…

8杯水要怎么喝才能防止或减轻肥胖状态?

为什么说&#xff0c;人每天要喝足8杯水呢&#xff1f;原因很多&#xff0c;皮肤干了要多喝水&#xff0c;因为皮肤缺水&#xff0c;需要滋养&#xff1b;身体底子差要多喝水&#xff0c;实际身体底子差不光要多喝水&#xff0c;还要注意饮食营养和运动锻炼&#xff1b;身体健康…

可视化低代码表单设计器

JNPF 表单设计器是一款在线可视化表单建模工具&#xff0c;基于VueSpringboot技术开发&#xff0c;具有组件丰富、操作简单、所见即所得等特性&#xff0c;既能够设计普通的数据录入表单&#xff0c;也能够配合流程设计出各类审批流转表单。 应用地址&#xff1a;https://www.j…

算法刷题:水果成篮

水果成篮 .题目链接题目详情题目解析算法原理滑动窗口定义指针及变量进窗口判断出窗口更新结果 我的答案 . 题目链接 水果成篮 题目详情 题目解析 这道题的意思是,在一个数组中,找到一个最长的连续的子数组,并且其中包含的水果种类不超过两个 left和right刚开始都指向数组首…

有哪些适合程序员的副业?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

靡语IT:Vue精讲(一)

Vue简介 发端于2013年的个人项目&#xff0c;已然成为全世界三大前端框架之一&#xff0c;在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的启发&#xff0c;从中提取自…