CF 336494 C. Meme Problem
336494 C. Meme Problem
Try guessing the statement from this picture:
You are given a non-negative integer d. You have to find two non-negative real numbers a and b such that a+b=d and a⋅b=d
Input
The first line contains t (1≤t≤1031≤t≤103) — the number of test cases.
Each test case contains one integer d (0≤d≤103)(0≤d≤103).
Output
For each test print one line.
If there is an answer for the ii-th test, print "Y", and then the numbers a and b
If there is no answer for the ii-th test, print "N".
Your answer will be considered correct if |(a+b)−a⋅b|≤10−6|(a+b)−a⋅b|≤10−6 and |(a+b)−d|≤10−6|(a+b)−d|≤10−6.
Example
input
7
69
0
1
4
5
999
1000
output
Y 67.985071301 1.014928699
Y 0.000000000 0.000000000
N
Y 2.000000000 2.000000000
Y 3.618033989 1.381966011
Y 997.998996990 1.001003010
Y 998.998997995 1.001002005
题意
输入一个d,判断是否存在a和b,使得a+b=d and a⋅b=d成立,如果存在,输出a和b
思路
- 观察式子 a+b=d and a⋅b=d,把第二个式子代入到第一个式子,化掉b,可得关于a的一元二次方程,此时d看成是系数。(或者用韦达定理来构成方程,并将a和b看成是方程的两个解)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
double d;
cin>>d;
double delta=d*d-4*d;
if(delta<0)cout<<'N'<<endl;
else
{
cout<<"Y ";
cout<<fixed<<setprecision(9);
cout<<(d+sqrt(delta))/2<<" "<<(d-sqrt(delta))/2<<endl;
}
}
return 0;
}