牛客小白月赛25 G 解方程
链接:https://ac.nowcoder.com/acm/contest/5600/G
来源:牛客网
题目描述
牛能作为一个学霸,非常擅长解方程。
有一天,他拿到了一个方程:
xa+blnx=cx^a+blnx=cxa+blnx=c
牛能当然一下子就解出了这个方程。但他想考考聪明的你,这个方程的解的多少?
输入描述:
三个正整数
输出描述:
如果解存在,请输出方程的解x的值,若你和正确答案的误差不超过 10−710^{-7}10−7 ,则认为你的答案正确。
如果解不存在,则输出。
示例1
输入
复制
3 5 1
输出
复制
1.00000000000000
二分法的模板 :
题目给出的函数很明显是单调增的
所以二分
浮点型的二分模板如下
while(rig-lef > 1e-9) {
mid = (lef + rig) / 2; //注意这里不能用右移运算符
double y = F(mid);
if(y == C) break;
if(y > C)
rig = mid;
else
lef = mid;
}
当然我跟喜欢下面这种
for(int i=1; i<=1000000; i++){
mid = (lef + rig) / 2; //注意这里不能用右移运算符
double y = F(mid);
if(y > C)
rig = mid;
else
lef = mid;
}
完整代码如下
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#include <unordered_map>
#define MAXN ((int)1e6+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#pragma GCC optimize(2)
#define QAQ (0)
using namespace std;
#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
int n, m, Q, K, A, B, C;
double eps = -1e7;
double F(double mid) {
double ret = mid;
for(int i=2; i<=A; i++)
ret *= mid;
ret += B*(log(mid));
return ret;
}
double ABS(double x) {
return x > 0.00000000 ? x : -x;
}
int main() {
#ifdef debug
freopen("test", "r", stdin);
clock_t stime = clock();
#endif
scanf("%d %d %d ", &A, &B, &C);
double lef = 0, rig = 1e9+7, mid, ans = 0;
#if 0
for(int i=1; i<=1000000; i++){
mid = (lef + rig) / 2;
double y = F(mid);
if(y > C) rig = mid;
else {
lef = mid;
}
}
printf("%.14lf\n", mid);
#else
while(rig-lef > 1e-9) {
mid = (lef + rig) / 2;
double y = F(mid);
if(y == C) break;
if(y > C) rig = mid;
else lef = mid;
}
printf("%.14lf\n", mid);
#endif
#ifdef debug
clock_t etime = clock();
printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
return 0;
}