题目大意:给出x∈(0,1)以及n∈(0,1e18),求sum foreach i(1<=i<=n) (x^i/i)保留四位小数的值。
用快速幂暴力求。考虑到题目只要求保留四位小数,而随着i的增大,x^1就越来越小,变化量被隐藏到四位小数后面去了。所以我们可以在适当的时候提前退出。
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
const ll M = 1000000;
double Power(double a, ll n)
{
double ans = 1;
while (n)
{
if (n & 1)
ans *= a;
a *= a;
n >>= 1;
}
return ans;
}
int main()
{
ll n;
double x;
scanf("%lf%lld", &x, &n);
double ans = 0;
for (int i = 1; i <= min(n, M); i++)
ans += Power(x, i) / (double)i;
printf("%.4f
",ans);
}