数学问题推公式

给定一个非负整数 d,请你找到两个非负实数 a,b,使得等式 a+b=d 和 a×b=d 同时成立。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含一个整数 d。

输出格式
每组数据输出一行答案:

如果存在满足条件的 a 和 b,则首先输出一个字母 Y,随后输出任意一组满足要求的 a 和 b。
如果不存在满足条件的 a 和 b,则输出一个字母 N。
只要你输出的 a 和 b 能够同时满足 |(a+b)−a×b|≤10−6 以及 |(a+b)−d|≤10−6,就视为正确。为了保证精度,建议输出结果保留10位小数。

数据范围
前三个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,0≤d≤1000。

输入样例:
10
0
1
2
3
4
5
6
7
8
9
输出样例:
Y 0.0000000000 0.0000000000
N
N
N
Y 2.0000000000 2.0000000000
Y 3.6180339754 1.3819660246
Y 4.7320508212 1.2679491788
Y 5.7912878394 1.2087121606
Y 6.8284271359 1.1715728641
Y 7.8541019708 1.1458980292
难度:困难
时/空限制:1s / 256MB
总通过数:829
总尝试数:1478
来源:AcWing,第52场周赛
算法标签
数学推公式韦达定理

分析:在这里插入图片描述
所以我们只要解出这个方程即可。根据一元二次方程解得通用公式有:​​​​​​​​​​​​​​​​​​​​​​​​​​​在这里插入图片描述

实现代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        double d;
        scanf("%lf",&d);
        
        if(d==0) puts("Y 0 0");
        else
        {
            if(d<4) puts("N");
            else
            {
                double t=sqrt(d*d-d*4);
                printf("Y %.10lf %.10lf\n",(d-t)/2,(d+t)/2);
            }
        }
  
    }
    return 0;
}

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值