zoukankan      html  css  js  c++  java
  • 【bzoj3000】Big Number 【斯特林公式】

    题意:给你两个整数N和K,要求你输出N!的K进制的位数。
    题解:首先补了一下对数的运算法则。
    1.loga(mn)=loga(m)+loga(n)
    2.loga(mn)=loga(m)loga(n)
    3.loga(mn)=nloga(m)
    4.loga(mn)=1nloga(m)
    再有一个n!的近似值公式,就是斯特林公式。
    n!2πn(ne)n
    于是我们就可以求答案了。
    ans=logk(n!)+1
    =>ans=logk(2πn(ne)n)+1
    =>ans=logk(2πn)+logk((ne)n)+1
    =>ans=12logk(2πn)+nlogk(ne)+1
    注意当n比较小的时候结果误差较大,可以直接暴力计算。
    代码

    #include<cstdio>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1),e=exp(1);
    ll n,k;
    double ans;
    int main(){
        while(~scanf("%lld%lld",&n,&k)){
            if(n<=10000){
                ans=1;
                for(int i=1;i<=n;i++){
                    ans=ans+log(i)/log(k);
                }
                printf("%lld
    ",(ll)ans);
            }else{
                ans=0.5*log(2*pi*n)/log(k)+n*log(n/e)/log(k)+1;
                printf("%lld
    ",(ll)ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    生成器函数
    初识函数
    格式化输出
    流程控制-while循环
    流程控制if语句
    Python入门
    Eclipse搭建C++开发环境
    Android SQLite基本用法
    Android拍照后更新相册
    操作系统相册和获取相册路径
  • 原文地址:https://www.cnblogs.com/2016gdgzoi471/p/9476874.html
Copyright © 2011-2022 走看看