题目:

  https://www.lydsy.com/JudgeOnline/problem.php?id=3000

题解:

  首先n很大,O(n)跑不过,那么就要用一些高端 而且没听过 的东西——stirling公式

  shirling公式:   n!≈√(2πn)*(n/e)^n

  这个公式对于n很大的解还是有很高的准确度的,但是对于n比较小的情况就会有误差。

  所以对于n很小就暴力。

  注意用log的一堆公式:

    lg(a*b)=lg(a)+lg(b);lg(a/b)=lg(a)-lg(b);

    lg (a^b) =b*lg(a);  logb=lg(a)/lg(b);

代码:

 #include<bits/stdc++.h>

 using namespace std;

 typedef long double ld;
typedef long long ll;
const ld pi=acos(-),e=exp(),eps=1e-;
ld log(ld a,ld b){return log(b)/log(a);}
ll n,k; int main(){
while(~scanf("%lld%lld",&n,&k)){
if(n<=){
ld ans=0.0;
for(int i=;i<=n;i++) ans+=log(i);
ans/=log(k); ans=ceil(ans+eps);
printf("%.0Lf\n",ans);
}
else printf("%lld\n",(ll)(0.5*log(k,2.0*pi*n)+n*log(k,n)-n*log(k,e)+));
}
return ;
}
05-11 18:24