有的时候我们需要对n!进行素因子分解,如果我们对1~n的每一个数都进行素因子分解然后再进行合并的话那么显然是很慢的因此我们需要重新来考虑这个问题。
我们对n!进行素因子分解:
n! = 1*2*3*4*…*n,因此它一定含有小于等于n 的所有素数我们要对这些素数分别进行处理求出含有多少项。
例如我们求n!含有多少个素因子p
设f[n][p] 表示n!含有多少素因子p;
1*2*3*4*…*n = p^(n/p)*(1*2*,,,,*(n/p))
那么 f[n][p] = n/p + f[n/p][p],就可以通过递归的方法求出了。
看题:
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的情况那么只有2*5的情况可以得到,那么我们可以对n!进行素因子分解,因为分解后2的个数一定是大于5的个数的因此我们只需要统计n!含有的素因子5的个数
但这个题与以往的题不同,这道题是反过来的,所以需要先估计所求值。根据等比数列求和大约为4q,然后再慢慢调整。
Q = N/5 + N/(5^2) + N/(5^3) + ...
由等比数列求和可得(设只到前k项):
Q = N(5^k - 1) / [4*(5^k)],由此得:
N = 4Q * [(5^k)/(5^k-1)]
注意:当Q为0时要输出1
0不是自然数( )#include <iostream>
using namespace std;
long long hehe(long long n)
{
int num=0;
while(n!=0)
{
num=n/5+num;
n=n/5;
}
return num;
}
int main()
{
long long q,n;
while(cin>>q)
{
if(q==0)
{
cout<<1<<endl;
continue;
}
n=q*4/5*5;
while(hehe(n)<q)
{
n=n+5;
}
if(hehe(n)==q)
cout<<n<<endl;
else
cout<<"No solution"<<endl;
}
return 0;
}