154. Factorial
time limit per test: 0.25 sec.
memory limit per test: 4096 KB
memory limit per test: 4096 KB
input: standard input
output: standard output
output: standard output
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.
Input
One number Q written in the input (0<=Q<=10^8).
Output
Write "No solution", if there is no such number N, and N otherwise.
Sample test(s)
Input
2
Output
10
末尾0只有10=2*5;找n! (1*2*……n)有几个5的倍数(2比5多,.'.只需找5)
问题转化为:找n,n!含有p个素因子5;
设f[n][p] 表示n!含有多少素因子p;
1*2*3*4*…*n = p^(n/p)*(1*2*,,,,*(n/p))*other
那么 f[n][p] = n/p + f[n/p][p],就可以通过递归的方法求出了。
#include<iostream>
#include<cstdio>
using namespace std;
long long f(long long n) // f[n][p] = n/p + f[n/p][p] (p=5)
{
if(n<5)
return 0;
else
return n/5+f(n/5);
}
int main()
{
long long m;
while(cin>>m)
{
int d=0;
if(m==0)
cout<<1<<endl;
else{
for(long long n=4*m;n<4*m+100;n++)
{
if(f(n)==m)
{
cout<<n<<endl;
d=1;
break;
}
}
if(d==0)
cout<<"No solution"<<endl;
}
}
return 0;
}