lightoj1045

来源:互联网 发布:java伪造ip请求头信息 编辑:程序博客网 时间:2024/06/03 18:37

斯特林公式

n!2πn(ne)n

求n!的位数
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
  res=(long)( (log10(sqrt(2.0*πn)) + n(log10(n)-log10(exp(1.0)))) + 1 );
  当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
  这种方法速度很快就可以得到结果。

代码如下:

#include <bits/stdc++.h>using namespace std;#define PI 2*acos(0)int main (){    int t, cnt = 1;    scanf("%d", &t);    while(t--)    {        int n, k;        scanf("%d %d", &n, &k);        printf("Case %d: ", cnt++);        if(!n || n == 1)        {            puts("1");            continue;        }        int ans = ((log10(sqrt(2*PI*n))/log10(k)) + n*((log10(n)/log10(k))-(log10(exp(1.0))/log10(k))) + 1);//斯特林公式        printf("%d\n", ans);    }    return 0;}