斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
SPOJ Factorial vs Power
题目大意:对于给定的a,求满足的 n! > an 最小的n。
思路:利用斯特林公式,可以代替到n!的计算,就不会超范围也不会超时啦~~~
#include <iostream>
#include <math.h>
using namespace std;
double PI=acos(-1.0);
bool check(long long n ,double a )
{
double x = (double )n;
double sum = x * log(x) - x + 0.5*(log(PI * 2 * x));
if(sum > x * log(a))
return 1;
else return 0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
double a ;
cin>>a ;
long long l = 1 , r=10*a;
long long mid ;
while(l < r)
{
mid = (l + r ) / 2;
if(check(mid,a))
r = mid ;
else
l = mid + 1;
}
cout<<l<<endl;
}
}