求n!在k进制下的位数,n<=1e18
斯特林公式:$n!approx sqrt{2pi n}(frac{n}{e})^n$
在n很大的时候有较好的精度保证。
$log_{k}n!+1=frac{1}{2}frac{ln(2pi n)}{ln k}+nfrac{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 ",(int)ceil(ans+eps)); 16 }else printf("%lld ",(long long)(0.5*log(2*pi*n)/log(k)+n*(log(n)-log(e))/log(k)+1)); 17 } 18 return 0; 19 }