[BZOJ3000]Big Number(斯特林公式)
求n!在k进制下的位数,n<=1e18
斯特林公式:$n!\approx \sqrt{2\pi n}(\frac{n}{e})^n$
在n很大的时候有较好的精度保证。
$\log_{k}n!+1=\frac{1}{2}\frac{\ln(2\pi n)}{\ln k}+n\frac{\ln n-\ln e}{\ln k}+1$
n较小时直接暴力求解即可。
1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 using namespace std; 6 7 const double pi=acos(-1.),e=exp(1),eps=1e-10; 8 int n,k; 9 10 int main(){ 11 while (~scanf("%d%d",&n,&k)){ 12 if (n<=1000){ 13 double ans=0; 14 rep(i,1,n) ans+=log(i); ans/=log(k); 15 printf("%d\n",(int)ceil(ans+eps)); 16 }else printf("%lld\n",(long long)(0.5*log(2*pi*n)/log(k)+n*(log(n)-log(e))/log(k)+1)); 17 } 18 return 0; 19 }