3000: Big Number
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 220 Solved: 62
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。
HINT
Source
本题需要用到Stirling公式
∴位数=log10(n!)+1
方案1:[WA]n!不断div k
但是这样做是错的。TNT
理由是不断div k 会把原来小的部分删掉
方案2:logk(n!)=log(1)+log(2)+...+log(n)
效率为O(n),显然也不行
于是不妨用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位