CodeChef C_HOLIC2解决方案找出最小的N,其阶乘产生P尾随零

时间:2017-06-25 06:41:31

标签: series factorial zero solution trailing

对于CodeChef问题C_HOLIC2,我尝试迭代元素:5, 10, 15, 20, 25,...并使用here指定的有效技术检查尾随零的数量,但得到了TLE。

使用公式方法解决此问题的最快方法是什么?

Here is the Problem Link

1 个答案:

答案 0 :(得分:0)

正如我们所知道的那样,计算一个数字的阶乘的尾随零的数量,使用的技巧是:

小于或等于500的5的倍数是 500÷5 = 100

然后,25的倍数是 500÷25 = 20

然后,125的倍数 500÷125 = 4

5的下一个幂是625,即>超过500。

因此,尾随零的数量是 100 + 20 + 4 = 124

有关详细说明,请查看this page

因此,这个计数可以表示为:

a busy cat

使用此技巧,给出数字 N ,您可以确定否。在其阶乘中的尾随零计数Codechef Problem Link

现在,假设我们得到了号码。尾随零,计数,我们被问到最小的没有。 N 其阶乘计数尾随零Codechef Problem Link

这里的问题是我们如何将计数分成这种表示? a busy cat

这是一个问题,因为在以下示例中,我们可以看到它变得困难。

a busy cat

即使no增加相同的数量,计数也会跳跃。 从下表中可以看出,对其因子具有5的整数幂的值进行计数跳跃,例如, 25,50,...,125,......

+-------+-----+
| count | N   |
+-------+-----+
| 1     | 5   |
+-------+-----+
| 2     | 10  |
+-------+-----+
| 3     | 15  |
+-------+-----+
| 4     | 20  |
+-------+-----+
| 6     | 25  |
+-------+-----+
| 7     | 30  |
+-------+-----+
| 8     | 35  |
+-------+-----+
| 9     | 40  |
+-------+-----+
| 10    | 45  |
+-------+-----+
| 12    | 50  |
+-------+-----+
| ...   | ... |
+-------+-----+
| 28    | 120 |
+-------+-----+
| 31    | 125 |
+-------+-----+
| 32    | 130 |
+-------+-----+
| ...   | ... |
+-------+-----+

你可以从任何蛮力程序中看到这个任务,这些跳跃经常发生,即6,12,18,24,如果数字的阶乘有25个。(间隔 = 6 = 1×5 1

在N = 31阶乘后,因子也将为125.因此,对应于25的这些跳跃仍然会以相同的频率发生,即31,37,43 ......

现在对应于125的下一跳将是31 + 31,即62.因此,对应于125的跳跃将发生在31,62,93,124。(间隔 = 31 = 6×5 + 1

现在对应于625的跳跃将发生在 31×5 + 1 = 155 + 1 = 156 因此,您可以看到存在一种模式。我们需要找到这种模式的公式来继续。

形成的系列是 1,6,31,156,...... 1,1 + 5,1 + 5 + 5 2 ,1 + 5 + 5 2 +5 3 。 ..

因此,n th 项是G.P的n项之和。 a = 1,r = 5

a busy cat

因此,计数可以是31 + 31 + 6 + 1 + 1等。 我们需要找到 t n ,它小于 count 但最接近它。即

a busy cat

假设数字 count = 35 ,然后使用此值我们确定 t n = 31 最接近。对于 count = 63 ,我们再次看到使用此公式,我们得到 t n = 31 是最接近但注意这里,31可以从 count = 63 中减去两次。现在我们继续找到这个n并继续从 count 中减去 t n ,直到 count 变为0。

使用的算法是:

        count=read_no()

        N=0

        while count!=0:

            n=floor(log(4*count+1,5))

            baseSum=((5**n)-1)/4

            baseOffset=(5**n)*(count/baseSum)  // This is integer division

            count=count%baseSum

            N+=baseOffset

        print(N)

这里,5 ** n是5 n

让我们尝试一下这个例子: 算数= 70, 迭代1:

a busy cat

迭代2:

a busy cat

迭代3:

a busy cat

再举一个例子。假设count = 124,这是本页开头讨论的那个: 迭代1:

a busy cat

PS :所有图片完全归我所有。我不得不使用图像,因为StackOverflow不允许嵌入MathJax。 #StackOverflowShouldAllowMathJax