zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    web框架学习
    css上
    数据库
    线程
    反射以及部分内置方法
    排序函数sort() 和sorted() 之介绍
    类的绑定方法
    继承
    面向对象和类
    混淆矩阵、准确率、召回率
  • 原文地址:https://www.cnblogs.com/LanrTabe/p/10513665.html
Copyright © 2011-2022 走看看