• [BZOJ3000]Big Number


    题目链接:

    BZOJ3000.

    好题?秒出想法然后被各种卡精度

    • 前置芝士:Stirling公式

    (n)较大时,有近似公式:

    [n!sim sqrt{2npi}(frac ne)^n ]

    首先,显然有答案位数(=leftlfloor log_kn! ight floor+1)

    (=leftlfloor log_k(sqrt{2npi}(frac ne)^n) ight floor+1)

    (=leftlfloor log_ksqrt{2npi}+nlog_kfrac ne ight floor+1)

    (pi=acos(-1),e=exp(1),log_k)可以使用(log_2)配合换底公式实现。

    但是要注意,(n)较小时Stirling公式的相对误差较大,需要使用(leftlfloor log_kn! ight floor+1=leftlfloor sum_{i=1}^nlog_ki ight floor+1)暴力计算。

    代码:

    #include <cmath>
    #include <cstdio>
    #define Log(a,b) (log(b)/log(a))
    
    int n,k;
    const double Pi=acos(-1),e=exp(1);
    
    int main()
    {
    	while(~scanf("%d%d",&n,&k))
    		if(n<=10000)
    		{
    			double Sum=0;
    			for(int i=2;i<=n;++i)Sum+=Log(k,i);
    			printf("%.f
    ",floor(Sum+1e-8)+1);//eps防止精度误差
    		}
    		else printf("%.f
    ",floor(Log(k,sqrt(2.0*n*Pi))+n*Log(k,n/e)+1e-8)+1);//公式计算
    	return 0;
    }
    
  • 相关阅读:
    hdu 1021
    hdu 1231 最大连续和
    hdu 1421 DP
    日记本开发
    hdu 2570 贪心
    hdu 2102 BFS
    hdu 1312 DFS
    奇葩的数组越界
    AngularJS 工具方法以及AngularJS中使用jQuery
    AngularJS $scope里面的$apply方法和$watch方法
  • 原文地址:https://www.cnblogs.com/LanrTabe/p/10513665.html
Copyright © 2020-2023  润新知