1375: 阶乘的零
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 333 Solved: 64
[Submit][Status][Web Board]
Description
定义f(n)为n!的末尾零的个数,例如f(4)=0,f(5)=1。你的任务是对于一个给定的的值x找出最小的n满足f(n)=x。
Input
多组测试数据,每组测试数据包含一个正整数x(1<=x<=10^8)。
Output
对于每组测试数据输出对应的n,若没有n满足则输出“No solution”。
Sample Input
2
Sample Output
10
HINT
water problem!
题目大意: 这道题乍一看以为是求阶乘末尾0的个数,后来看了输入输出发现是反的,题目要求输入阶乘末尾0的个数,输出满足条件的最小的n。
想法: 一开始从正向考虑,即考虑n的阶乘末尾有几个0,发现给定0的个数时的最小n一定是5的倍数,直接想到暴力解决,结果超时了,于是改用二分法,时间复杂度降了很多,顺利ac了。看了罗杰的博客说这题有数学公式可以秒解,但是我找了半天也没找到规律,就这样直接做了。
判断阶乘末尾0个数的方法:循环除5结果相加即可。如25/5 = 5 ,5/5 = 1 ,1+5 = 6,所以25阶乘末尾有6个0.
完整代码:
#include <stdio.h>
long long facs(long long n)
{
long long num=0;
long long b=1;
while(1)
{
b*=5;
num+=n/b;
if(b>n)
break;
}
return num;
}
int main()
{
long long p,i;
int flag;
while(~scanf("%lld",&p))
{
flag=0;
long long left=5;
long long right=10000000000;
while(left<right)
{
long long mid=(left+right)/2;
long long q=facs(mid);//中间位置
if(p==q)
{
while(mid%5!=0)
mid--;//要得到最小的数
printf("%lld\n",mid);
flag=1;
break;
}
if(q>p)
right=mid-1;
else
left=mid+1;
}
if(flag==0)
printf("No solution\n");
}
return 0;
}