对于CodeChef问题C_HOLIC2
,我尝试迭代元素:5, 10, 15, 20, 25,...
并使用here指定的有效技术检查尾随零的数量,但得到了TLE。
使用公式方法解决此问题的最快方法是什么?
答案 0 :(得分:0)
正如我们所知道的那样,计算一个数字的阶乘的尾随零的数量,使用的技巧是:
小于或等于500的5的倍数是 500÷5 = 100
然后,25的倍数是 500÷25 = 20
然后,125的倍数 500÷125 = 4
5的下一个幂是625,即>超过500。
因此,尾随零的数量是 100 + 20 + 4 = 124
有关详细说明,请查看this page
因此,这个计数可以表示为:
使用此技巧,给出数字 N ,您可以确定否。在其阶乘中的尾随零计数。 Codechef Problem Link
现在,假设我们得到了号码。尾随零,计数,我们被问到最小的没有。 N 其阶乘计数尾随零Codechef Problem Link
这里的问题是我们如何将计数分成这种表示?
这是一个问题,因为在以下示例中,我们可以看到它变得困难。
即使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
因此,计数可以是31 + 31 + 6 + 1 + 1等。 我们需要找到 t n ,它小于 count 但最接近它。即
假设数字 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:
迭代2:
迭代3:
再举一个例子。假设count = 124,这是本页开头讨论的那个: 迭代1:
PS :所有图片完全归我所有。我不得不使用图像,因为StackOverflow不允许嵌入MathJax。 #StackOverflowShouldAllowMathJax