zoukankan      html  css  js  c++  java
  • BZOJ 3000: Big Number (数学)

    题目:

      https://www.lydsy.com/JudgeOnline/problem.php?id=3000

    题解:

      首先n很大,O(n)跑不过,那么就要用一些高端 而且没听过 的东西——stirling公式

      shirling公式:   n!≈√(2πn)*(n/e)^n

      这个公式对于n很大的解还是有很高的准确度的,但是对于n比较小的情况就会有误差。

      所以对于n很小就暴力。

      注意用log的一堆公式:

        lg(a*b)=lg(a)+lg(b);lg(a/b)=lg(a)-lg(b);

        lg (a^b) =b*lg(a);  logab=lg(a)/lg(b);

    代码:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef long double ld;
     6 typedef long long ll;
     7 const ld pi=acos(-1),e=exp(1),eps=1e-10;
     8 ld log(ld a,ld b){return log(b)/log(a);}
     9 ll n,k;
    10 
    11 int main(){
    12     while(~scanf("%lld%lld",&n,&k)){
    13         if(n<=10000){
    14             ld ans=0.0;
    15             for(int i=1;i<=n;i++)    ans+=log(i);
    16             ans/=log(k);    ans=ceil(ans+eps);
    17             printf("%.0Lf
    ",ans);    
    18         }
    19         else printf("%lld
    ",(ll)(0.5*log(k,2.0*pi*n)+n*log(k,n)-n*log(k,e)+1));
    20     }
    21     return 0;    
    22 }
  • 相关阅读:
    bind函数
    尾置返回类型
    lambda表达式
    C++谓词
    capacity和size
    容器操作可能会使迭代器失效
    特殊的forward_list操作
    向顺序容器添加元素
    swap与assign
    迭代器
  • 原文地址:https://www.cnblogs.com/tang666/p/8880897.html
Copyright © 2011-2022 走看看