BZOJ3000: Big Number

我们有斯特灵近似公式
然后就可以快速求了

http://blog.csdn.net/ws_yzy/article/details/50725649
公式:
n!≈ sqrt(2πn)*((n/e)^n)

注意精度

#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;


#define ld long double
#define ll long long 

const
    ld pi=acos(-1);
const
   ld e=exp(1);
int main()
{
     ll n;  
     int d;
    while(scanf("%lld%d",&n,&d)!=EOF)
    {
        if(n<=10000) 
          {
            ld ans=0;
            for(int i=1;i<=n;i++)
               ans+=log(i);
            ans/=log(d);
            ans=ceil(ans+1e-10);
            printf("%lld\n",(ll)ans);
          }
          else
             printf("%lld\n",1+(ll)((0.5*log(2*pi*n)+n*log(n)-n*log(e))/log(d)));

    }


}

你可能感兴趣的:(BZOJ3000: Big Number)