0%

51nod-2652-阶乘0的数量

给出一个数k,求最小的n,使得n的阶乘后面0的数量>=k。

例如k=1,

5的阶乘 = 12345 = 120,120后面有1个0。并且4的阶乘后面没有0,所以5是最小的结果。

输入
一个数k(1 <= k <= 10^9)
输出
输出最小的满足条件的n。
输入样例
1
输出样例
5
解法:
每个0都是由2*5求得出来的,因而每个5之前肯定有存在足量的2,因此只需计算5的个数即可,当碰到25,50,125这种可以分解为多个5的数,便需要多计算,采用二分快速计算,二分时注意边界情况,0的个数不是连续的
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using namespace std;
int n;
long long c(int x)
{
long long sum = x;
int now = 5;
while(x/now != 0)
{
sum += x/now;
now *= 5;
}
return sum;
}
int main()
{
scanf("%d", &n);
int l = 1, r = n;
long long ans = 0;
while(l < r)
{
int m = (l+ r)/2;
// printf("l:%d r:%d m:%d\n",l,r,m);
if(c(m) < n)
l = m + 1;
else if(c(m) > n)
r = m;
else
{
ans = m;
break;
}
}
if(ans != 0)
{
printf("%lld", ans * 5);
return 0;
}
if(c(l) == n)
ans = l;
else
{
ans = r;
}
printf("%lld", ans * 5);
return 0;
}