题目大意:
求$displaystyle{sum_{i=1}^{n}frac{x^i}{i}}$的值。
思路:
考虑暴力模拟:时间复杂度$O(n)$,看起来不错,然而$nleq 10^{18}$,肯定会超时,实测只有30分。
观察题目发现题目所求的算式与泰勒展开公式极其相似,所以可以先算出$lim=-ln(1-x)$的值。
由于题目要求的是四位小数,所以当答案$ans$保留四位小数与$lim$相等时,后面的运算已经失去了意义,直接输出结果即可。
1 #include<cmath> 2 #include<cstdio> 3 int main() { 4 double x; 5 long long n; 6 scanf("%lf%lld",&x,&n); 7 double lim=-log(1-x); 8 double ans=0; 9 double t=1; 10 for(long long i=1;i<=n;i++) { 11 ans+=(t*=x)/i; 12 if(round(lim*10000)==round(ans*10000)) break; 13 } 14 printf("%.4lf ",ans); 15 return 0; 16 }