0383 阶乘整除性
* * * *
拉格朗日计划
* * * *
阶乘整除性

记$f_5(n)$为能使得$5^x$整除n的最大整数$x$。例如,$f_5(625000)=7$。

记$T_5(n)$为满足$f_5((2i-1)!) < 2\cdot f_5(i!)$且$1\le i\le n$的整数i的数量。

可以验证,$T_5(10^3)=68$以及$T_5(10^9)=2408210$。

求$T_5(10^{18})$。

本题难度:



解答

当$n=5^k$时$T_5(n)$形成OEIS A180168中的序列,即 $$T_5(5^k)=2T_5(5^{k-1})+5T_5(5^{k-2}).$$ 随后把$5^k$分解为五个大小为$5^{k-1}$的块分别递归处理即可,最终结果是$22173624649806$。

import math

def T5(k):
    if k <= 2:
        return [0,1,3][k]
    return 2*T5(k-1)+5*T5(k-2)

def T(n):
    if n < 5:return 0
    k=int(math.log(n,5))
    r=n//5**k
    if n <= 2*5**k:
        return r*T5(k)+T((n-r*5**k))
    elif n < 3*5**k:
        return 2*T5(k)+T((n-2*5**k)) if n < 2*5**k+3*5**(k-1) else T(2*5**k+3*5**(k-1)-5)
    else:
        return 2*T5(k)+3*T5(k-1)+T((n-3*5**k)//5)

print T(10**18)