HDU 2675 Equation Again
公式转化+二分答案
首先,把题目中给的等式转化一下,变成了这个样子。
等式右边的值是可以求出来的。
ln(x)/x的大致图像是这样的
那么只要对[0,e]和[e,+∞]分别进行二分答案即可。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; double Y,k; const double e=2.71828182845904523536; int main() { while(~scanf("%lf",&Y)) { k=(1+log(Y))/(e*Y); int flag=0; double l=0,r=e; double mid=(l+r)/2; if(k>1.0/e) { printf("Happy to Women’s day!\n"); continue; } if(Y==1) { printf("2.71828\n");continue; } while(1) { if(fabs(log(mid)/mid-k)<0.000000000001) { flag=1; printf("%.5lf ",mid); break; } if(log(mid)/mid>k) { r=mid; mid=(l+r)/2; } else { l=mid; mid=(l+r)/2; } if(fabs(l-r)<0.000000000001) break; } l=e,r=5000; mid=(l+r)/2; while(1) { if(fabs(log(mid)/mid-k)<0.00000000001) { flag=1; printf("%.5lf\n",mid);break; } if(log(mid)/mid<k) { r=mid; mid=(l+r)/2; } else { l=mid; mid=(l+r)/2; } if(fabs(l-r)<0.000000000001) break; } if(!flag) printf("Happy to Women’s day!\n"); } return 0; }