题意:求n!在b进制下的位数(n<=2^31)。


好像要高精!?好像会TLE!?根本不会做!


然后想到answer=∑log(k,i)


然后积分?∫ln(x) dx = xln(x) - x


小数据直接跑,过之。试个极限数据,差了3!?


仔细一想,对数函数是凹的,这样算答案当然会偏小。


百度了一下,发现有个公式:n!≈√(2*π*n)*(n/e)^n。


拆开之后发现就是比原来的积分多了个ln(2*π*n)


#include <cstdio>

#include <cmath>


const double pi = asin(1) * 2.0;


double calc(double n, double k) {

double ans = 0;

if (n < 100000) {

for (int i = 1; i <= n; ++ i)

ans += log(i);

ans /= log(k);

}

else {

ans = (0.5 * log(pi * n * 2) + log(n) * n - n) / log(k);

}

return ans + 0.5;

}


int main() {

#ifndef ONLINE_JUDGE

freopen("in.txt", "r", stdin);

#endif


double n, k;

while (scanf("%lf%lf", &n, &k) != EOF)

printf("%.0lf\n", calc(n, k));

}



Historical Comments

Unknown friend at 2014-11-30T17:55:51

积分……跪烂
底下那个斯特林公式说真的 小数据差的太远(如果20应该叫做小数据)