0462 三光滑数重排
* * * *
拉格朗日计划
* * * *
三光滑数重排

3-光滑数是指所含质因数不大于3的整数。令$S(N)$为所有不超过N的3-光滑数所组成的集合,例如$S(20)=\{1, 2, 3, 4, 6, 8, 9, 12, 16, 18\}$。

排列$S(N)$中的元素,使得每个元素都排在其所有的真因数之后,记满足要求的排列数为$F(N)$。

例如$1, 2, 4, 3, 9, 8, 16, 6, 18, 12$是$S(20)$的一个满足要求的排列,但$1, 2, 4, 3, 9, 8, 12, 16, 6, 18$不是,因为此排列中12出现在了其真因数6之前。

可以验证$F(6)=5, F(8)=9, F(20)=450, F(1000)\approx8.8521816557e21$。

求$F(10^{18})$,将结果用科学计数法表示,用小写字母e分割尾数和指数,其中尾数保留10位小数。例如若结果是$112,233,445,566,778,899$,则应写作$1.1223344557e17$。

本题难度:



解答

本题与第412题类似,都是使用hook-length formula作杨表(Young Tableau)个数的计算,以下代码直接改编自官方论坛,最终结果是$5.5350769703e1512$。

注:为便于用f-string格式化输出,以下代码为Python 3。

import math
N=10**18

T=[]
b=1
while b < N:
    a,n=b,0
    while a < N:
        n+=1
        a*=2
    T.append(n)
    b*=3

ans=math.factorial(sum(T))

for b in range(len(T)):
    for a in range(T[b]):
        ans//=T[b]-a+sum(T[c]>a for c in range(b+1,len(T)))

p=int(math.log10(ans))
print(f"{ans/(10**p):.10f}e{p}")