0154 帕斯卡金字塔
* * * *
拉格朗日计划
* * * *
帕斯卡金字塔

用小球构建一个金字塔,每一个球的下一层都恰好有三个球支撑。



从顶端出发,每次都走向下一层,到达当前球下方作为支撑的三个球之一,不难看出到达每个位置的路径总数就是它上方的球的路径总数之和(根据位置的不同,每个球上方最多可能有三个球)。

每个位置上的路径总数形成的金字塔状的数组称为帕斯卡金字塔(与帕斯卡三角类似),金字塔第n层的结果就是三项式$(x+y+z)^n$展开式中各项的系数(正如帕斯卡三角第n层的结果就是二项式$(x+y)^n$展开式中各项的系数)。

在三项式$(x+y+z)^{200000}$的展开式中,有多少个系数是$10^{12}$的倍数?

本题难度:



解答

三项式$(x+y+z)^{n}$的展开式中$x^ay^bz^c$项的系数是 $$\frac{n!}{a!b!c!}=\binom{n}{a}\binom{n-a}{b}.$$ 因此先令k从2取到200000,缓存$k!$的质因数分解中2和5的次数。

接下来不妨设$a\le b \le c$,取a从0到$200000/3$:

若$\binom{n}{a}$已能被$10^{12}$整除,则直接统计(实际计算结果显示不存在这样的情况)。

若$\binom{n}{a}(n-a)!$中2和5的次数都小于12,则$10^{12}$必定不能整除$\frac{n!}{a!b!c!}$,也无需再作计算(在a充分大时能跳过不少循环)。

对其它情形则再令b从a取到$(n-a)/2$并根据缓存的$k!$统计。

最后结果是$479742450$。

n=200000
p=[1 << k for k in range(19)]
q=[5**k for k in range(9)]

u=[0]*(n+1)
v=[0]*(n+1)

for k in range(2,n+1,2):
    i=0
    while k%p[i]==0:
        i+=1
    u[k]=i-1

for k in range(5,n+1,5):
    i=0
    while k%q[i]==0:
        i+=1
    v[k]=i-1

for k in range(1,n+1):
    u[k]=u[k-1]+u[k]
    v[k]=v[k-1]+v[k]

r=0
for a in range(n/3+1):
    if u[n]-u[a]-u[n-a]>=12 and v[n]-v[a]-v[n-a]>=12:
        if (n-a)%2==0:
            r+=((n-a)/2-a)*6
        else:
            r+=((n-a)/2-a)*6+3
        print a, ((n-a)/2-a)*6 if (n-a)%2==0 else ((n-a)/2-a)*6+3
    elif u[n]-u[a]>=12 and v[n]-v[a]>=12:
        for b in range(a,(n-a)/2+1):
            c=n-a-b
            if u[n]-u[a]-u[b]-u[c]>=12 and v[n]-v[a]-v[b]-v[c]>=12:
                if a==b or b==c:
                    r+=3
                else:
                    r+=6
    if a%1000==0: print a

print r