bzoj3000 Big Number 数论,斯特林公式

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
对于100%的数据,有2≤N≤2^31, 2≤K≤200,数据组数T≤200。

题解

用Stirling公式求近似值

位数=logk(n!)+1

≈ logk(sqrt(2πn)*(n/e)^n)+1

= logk( sqrt(2πn))+log[(n/e)^n]+1

=1/2*logk( 2πn)+nlog(n/e)+1

=0.5*logk ( 2πn)+nlog(n/e)+1

=0.5*logk ( 2πn)+nlog(n)-nlog(e)+1

PS:pi=acos(-1.0),e=exp(1)

PS2:eps的存在是为了防止n=2,k=2这样刚好的情况出现,这个时候向上取整要多取1位

斯特林公式是求解n!的近似解,对于较大的n数值是十分准确的。

所以可以通过数学方法解决。

 1 #include<cstring>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<algorithm>
 6
 7 #define ll long long
 8 using namespace std;
 9 const double eps=0.00000000001;
10 const double pai=3.14159265359;
11 const double e=exp(1);
12
13 int n,k;
14
15 int main()
16 {
17     freopen("fzy.in","r",stdin);
18     freopen("fzy.out","w",stdout);
19     while(~scanf("%d%d",&n,&k))
20     {
21         if (n<=1000)
22         {
23             double ans=0;
24             for (int i=1;i<=n;i++)
25                 ans+=log(i);
26             ans/=log(k);
27             int res=ceil(ans+eps);
28             printf("%d\n",res);
29         }
30         else
31         {
32             double res=(log(sqrt(2*pai*n))+n*log(n/e))/log(k);
33             ll ans=ceil(res-eps);
34             printf("%lld\n",ans);
35         }
36     }
37 }

对了,c++小数处理的时候会有精度损失的问题,所以需要适当加上一个小数

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8168735.html

时间: 2024-11-06 07:39:28

bzoj3000 Big Number 数论,斯特林公式的相关文章

HDU 4937 Lucky Number(数论)

HDU 4937 Lucky Number 题目链接 题意:给定一个数字,求它再x进制下,每位进制位上都只有3,4,5,6,求这样的x有多少种,如果无限种输出-1 思路:首先3 4 5 6特判掉是无限的,很容易想到就不证明了,然后就是枚举数字的最后一位3,4,5,6,然后进制数肯定来自这个数字的因子,因为剩下的数字肯定是a1x^1 + a2x^2 + a3x^3...这样的,这样只要在因子中找进制,去判断即可.找因子的方法用先分解再dfs找,直接试除会超时 代码: #include <cstdi

NYOJ 411 Friends number (数论--因子和)

链接:点击打开链接 题意: Friends number 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 Paula and Tai are couple. There are many stories between them. The day Paula left by airplane, Tai send one message to telephone 2200284, then, everything is changing- (The story in

[POJ3696]The Luckiest number(数论)

题目:http://poj.org/problem?id=3696 题意:给你一个数字L,你要求出一个数N,使得N是L的倍数,且N的每位数都必须是8,输出N的位数(如果不存在输出0) 分析: 首先我们假设N是x个8组成的 那么88888...888=kL 提个8出来:8*111..1111=kL ① 因为题目只要求x的值,所以要弄出关于x的方程 11...111可以写成(10^k-1)/9 于是①变成了8(10^x-1)=9kL ② 再来回顾下题目,②式中x和k是变量,且都属于正整数,要根据②式

BZOJ3000 Big Number

由Stirling公式: $$n! \approx \sqrt{2 \pi n} (\frac{n}{e})^n$$ 故:$$\begin{align} ans &= log_k n! + 1 \\ &\approx log_k [\sqrt{2 \pi n} (\frac{n}{e})^n] + 1 \\ &= \frac{1}{2} log_k 2 \pi n + n * (log_k n - log_k e) + 1\\ \end {align}$$ 又$log_a b =

hdu-2685I won&#39;t tell you this is about number theory(数论)

题目链接: I won't tell you this is about number theory Problem Description To think of a beautiful problem description is so hard for me that let's just drop them off. :)Given four integers a,m,n,k,and S = gcd(a^m-1,a^n-1)%k,calculate the S. Input The fi

hdoj 1492 The number of divisors(约数) about Humble Numbers 【数论】【质因子分解 求和】

定理:一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的个数就是,(r1+1)*(r2+1)*...*(rk+1). 理解:为什么是加1之后再相乘,因为一个数的的因子数至少为1和他自身,但因为r1,r2..可以为0,所以因子的个数为(r1+1)... 拓展一下: 定理1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的

hdu 1018 Big Number 两种方法 log方法(300+ms)+斯特林公式(0+ms)

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

数论 Number Transformation HDU4952

已知n,k,操作k次,每次操作求大于n且能被次数i整除的最小的数 已知x*i,所以(i+1)*y>=x*i,y>=x-[x/(i+1)],当x<i+1时,y的值不再改变,直接break,输出y*k即可(x,y都是倍数) #include <stdio.h> int main() { long long n,k; long long i; int time=0; while(scanf("%I64d%I64d",&n,&k)!=-1) { i

HDU 1005 Number Sequence(数论)

HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple