阶乘的素因子分解

有的时候我们需要对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;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值