链接:https://www.nowcoder.com/acm/contest/75/A
来源:牛客网
题目描述
夫夫有一天对一个数有多少位数感兴趣,但是他又不想跟凡夫俗子一样,
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。
输入描述:
第一行是一个整数
t(0<t<=1000000)
t
(
0
<
t
<=
1000000
)
(表示t组数据)
接下来t行,每一行有一个整数n(0<=n<=10000000)
输出描述:
输出n!在8进制下的位数。
输入
3
4
2
5
输出
2
1
3
解题思路
斯特林公式: n!≈(2πn)−−−−−√(ne)n n ! ≈ ( 2 π n ) ( n e ) n
列等式 n!=8k n ! = 8 k 得k,则k+1即为所求位数。
则 (2πn)−−−−−√(ne)n=8k ( 2 π n ) ( n e ) n = 8 k ,
两边同时取对数有:
log((2πn)−−−−−√(ne)n)=log((2πn)−−−−−√)+log((ne)n) l o g ( ( 2 π n ) ( n e ) n ) = l o g ( ( 2 π n ) ) + l o g ( ( n e ) n ) =log((2πn)−−−−−√)+n(log(n)−log(e)) = l o g ( ( 2 π n ) ) + n ( l o g ( n ) − l o g ( e ) )
log(8k)=k∗log(8) l o g ( 8 k ) = k ∗ l o g ( 8 ) ,
所以, k=log((2πn)√)+n(log(n)−log(e))log(8) k = l o g ( ( 2 π n ) ) + n ( l o g ( n ) − l o g ( e ) ) l o g ( 8 ) ,k+1即为所求位数。
PS:cin取消同步依旧会挂掉。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 107
#define INF 0x3f3f3f3f
const double PI=acos(-1.0);
const double epx=exp(1.0);
int main()
{
int T;
ll n;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(n==0||n==1)
printf("1\n");
else
printf("%lld\n",(ll)(((log10(sqrt(2*PI*n))+n*(log10(n)-log10(epx)))/log10(8))+1));
}
return 0;
}