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\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

时间: 2024-10-07 15:27:25

BZOJ 3000: Big Number (数学)的相关文章

BZOJ 3000 Big Number 数学算法

题目大意:求n!在k进制下的位数 即 Stirling公式: 数据范围小就暴力,数据范围大套用Stirling公式 注意先利用log来避免数字过大而失精 最后答案要开long long #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const double pi=

BZOJ 3000(Big Number-Stirling公式求n!近似值)

3000: Big Number Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 220  Solved: 62 [Submit][Status] Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数--N,K Output 每行一个数为输出结果. Sample Input 2 5 2 10 10 10 100 200 Sample Output 1 1 7 69 对

HDU 4937 Lucky Number (数学,进制转换)

题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last); //把[first0,last0)之间的部分替换成[first,last)之间的字符串 /* 题意: 我们将3,4,5,6认为是幸运数字.给定一个十进制数n. 现在可以讲起任意转

HDU 1018 Big Number 数学题解

Problem Description In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of

【BZOJ 2326】 [HNOI2011]数学作业

2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1100  Solved: 625 [Submit][Status] Description 矩阵乘法. 可以用类似于秦九韶算法,把被取模的数拆开. 如123%m=(((1%m)*10+2)%m*10+3)%m 我们发现对于位数相同的数的计算方法是一样的,想到矩阵乘法. 对于1位的数: matrix x=10^1  0  0 1       1  0 0  

HDU 5062 Beautiful Palindrome Number(数学)

主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=5062 Problem Description A positive integer x can represent as (a1a2-akak-a2a1)10 or (a1a2-ak?1akak?1-a2a1)10 of a 10-based notational system, we always call x is a Palindrome Number. If it satisfies 0<

hdu 1018 Big Number 数学结论

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34084    Accepted Submission(s): 16111 Problem Description In many applications very large integers numbers are required. Some of these

BZOJ 3143 游走 | 数学期望 高斯消元

啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下.每经过一条边,要付出这条边的编号这么多的代价.现将所有边用1~m重新编号,使总代价的期望最小,求这个最小值. 题解 我们可以求出每条边的期望经过次数,然后贪心地让经过次数多的边编号小即可. 直接用边来列方程求经过次数似乎列不出来,我们借助点来列方程. 设x[u]为从某个点出发的次数的期望,v为与u

BZOJ 1485 卡特兰数 数学

思路: 通过打表观察 这是个卡特兰数 但是它mod的数不是质数 怎么办呢 把所有数分解质因数好了 线性筛出mindiv  顺着mindiv分解质因数 复杂度$O(nlogn)$ //By SiriusRen #include <cstdio> using namespace std; const int N=2000005; int n,p,prime[N],top,mindiv[N],cnt[N]; void get_prime(){ for(int i=2;i<=2000000;i+