BZOJ 3000: Big Number (数学)
题目:
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); logab=lg(a)/lg(b);
代码:
1 #include<bits/stdc++.h>
2
3 using namespace std;
4
5 typedef long double ld;
6 typedef long long ll;
7 const ld pi=acos(-1),e=exp(1),eps=1e-10;
8 ld log(ld a,ld b){return log(b)/log(a);}
9 ll n,k;
10
11 int main(){
12 while(~scanf("%lld%lld",&n,&k)){
13 if(n<=10000){
14 ld ans=0.0;
15 for(int i=1;i<=n;i++) ans+=log(i);
16 ans/=log(k); ans=ceil(ans+eps);
17 printf("%.0Lf\n",ans);
18 }
19 else printf("%lld\n",(ll)(0.5*log(k,2.0*pi*n)+n*log(k,n)-n*log(k,e)+1));
20 }
21 return 0;
22 }