题目:
Equation Again
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1470 Accepted Submission(s): 458
Problem Description
This problem’s author is too lazy to write the problem description, so he only give you a equation like X
(eY) == (eY)
x, and the value of Y, your task is calculate the value of X.
Note : here e is the Natural logarithm.
Note : here e is the Natural logarithm.
Input
Each line will contain one number Y(Y >= 1). Process to end of file.
Output
For each case, output X on one line, accurate to five decimal places, if there are many answers, output them in increasing order, if there is no answer, just output “Happy to Women’s day!”.
Sample Input
1
Sample Output
2.71828
Author
WhereIsHeroFrom
Source
Recommend
描述:给出二元方程和y的值,求x的值
题解:对给出的式子两边取自然对数把指数放下来,x,y分别放在等式两边得到新的关系,右边是1/e乘以y的多项式。y=1时多项式的值为1。对左边,求导可以看到是一个先增后减的函数,在x=e处取最大值,那么枚举时超过e时的值就可以直接舍弃了,剩下的二分枚举,y!=1时有两个解。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const double ee = 2.718281828459;
const double eps = 1e-7;
int main()
{
double x, y;
while (scanf("%lf", &y) != EOF)
{
double tmp = (1 + log(y)) / (y*ee);
double low = 1 + eps, hei = ee - eps, mid;
if (tmp*ee - 1>eps)
{
puts("Happy to Women’s day!");
continue;
}
while (hei - low>eps)
{
mid = (hei + low) / 2;
if (log(mid)*(y*ee)>(1 + log(y))*mid)
hei = mid;
else
low = mid;
}
if (y == 1)printf("%.5lf\n", (hei + low) / 2);
else if (y>1)
{
double ans = (hei + low) / 2;
low = ee + eps, hei = 1e9 + eps;
while (hei - low>eps)
{
mid = (hei + low) / 2;
if (log(mid)*(y*ee)<(1 + log(y))*mid)
hei = mid;
else
low = mid;
}
printf("%.5lf %.5lf\n", ans, (hei + low) / 2);
}
}
return 0;
}