BZOJ 3000: Big Number (数学)

本文介绍了一种利用斯特灵公式高效计算大整数阶乘的方法,并通过代码实现了该算法。斯特灵公式适用于n较大时的计算场景,而对于较小的n则采用直接计算的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

  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\n",ans);    
18         }
19         else printf("%lld\n",(ll)(0.5*log(k,2.0*pi*n)+n*log(k,n)-n*log(k,e)+1));
20     }
21     return 0;    
22 }

 

转载于:https://www.cnblogs.com/tang666/p/8880897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值