P2759奇怪的函数
看到没有牛顿迭代法,我来水一波
首先,牛顿迭代公式
对于此题,由于
考虑如何减小运算值
然后对左边求导,得
于是可以写出此题的迭代公式
那么代码实现就贼简单辣!
注意一下浮点数要向上取整即可
#include<cstdio>
#include<cmath>
double solve(double n,double x0)//牛顿法
{
double x=x0-(x0*log10(x0)-n)/(log10(x0)+1/log(10));
while(abs(x-x0)>1e-10)//控制精度,实际上没必要那么高
x0=x,x=x0-(x0*log10(x0)-n)/(log10(x0)+1/log(10));
return x;
}
int main()
{
int n,ans;
scanf("%d",&n);
--n;//这样方便之后的处理
ans=solve(n,38);
if(int(ans*log10(ans)+0.5)<n)++ans;//检测解是否为整数,不是则向上取整
printf("%d",ans);
}
附:据说牛顿迭代是二阶收敛的,但涉及到极限的东西对我而言是玄学
所以复杂度大概也是