【bzoj3000】Big Number 【斯特林公式】
题意:给你两个整数N和K,要求你输出N!的K进制的位数。
题解:首先补了一下对数的运算法则。
1.
2.
3.
4.
再有一个的近似值公式,就是斯特林公式。
于是我们就可以求答案了。
=>
=>
=>
注意当n比较小的时候结果误差较大,可以直接暴力计算。
代码
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const double pi=acos(-1),e=exp(1);
ll n,k;
double ans;
int main(){
while(~scanf("%lld%lld",&n,&k)){
if(n<=10000){
ans=1;
for(int i=1;i<=n;i++){
ans=ans+log(i)/log(k);
}
printf("%lld\n",(ll)ans);
}else{
ans=0.5*log(2*pi*n)/log(k)+n*log(n/e)/log(k)+1;
printf("%lld\n",(ll)ans);
}
}
return 0;
}