0217 平衡数
* * * *
拉格朗日计划
* * * *
平衡数

若一个k位十进制正整数的前$\lceil k/2\rceil$个数字之和等于其后$\lceil k/2\rceil$个数字之和,则称之为平衡数。此处$\lceil \cdot \rceil$表示向上取整。

例如所有的回文数都是平衡数,13722也是平衡数。

记$T(n)$为所有小于$10^n$的平衡数之和,则有$T(1)=45$,$T(2) = 540$以及$T(5)=334795890$。

求$T(47) \bmod 3^{15}$。

本题难度:



解答

记$c(i,j)$为由0到9的数字组成的、长度为i,且各位之和为j的有序数字串的数量。

记$s(i,j)$为由0到9的数字组成的、长度为i,且各位之和为j的有序数字串之和(视作带前导0的十进制数)。

则对每个固定的i,j都可以从0取到9i,且有初值 $$c(1,j)=1, \quad s(1,j)=j.$$ 考虑在$i-1$位数后添加一位数k的情况,又得 $$c(i,j)=\sum_{k=0}^{\min(j,9)}c(i-1,j-k), \quad s(i,j)=\sum_{k=0}^{\min(j,9)}10\cdot s(i-1,j-k)+k\cdot c(i-1,j-k).$$ 再记$c^*(i,j)$为由0到9的数字组成的、长度为i,不以0开头,且各位之和为j的有序数字串的数量。

以及$s^*(i,j)$为由0到9的数字组成的、长度为i,不以0开头,且各位之和为j的有序数字串之和。

则有 $$c^*(i,j)=c(i,j)-c(i-1,j), \quad s^*(i,j)=s(i,j)-s(i-1,j).$$ 记$T^*(n)$为长度恰好为n的平衡数之和。

若$n=2m$是偶数,则每一个长度为m、不含前导0、和为j的数串都可以作为前m位,它可以分别拼接$c(m,j)$个长度为m、含前导0、和为j的数串得到平衡数。

同理,每一个长度为m、含前导0、和为j的数串都可以作为后m位,在它之前可以分别拼接$c^*(m,j)$个长度为m、不含前导0、和为j的数串得到平衡数。

因此 $$T^*(n)=\sum_{j=1}^{9m}10^m\cdot s^*(m,j)\cdot c(m,j)+s(m,j)\cdot c^*(m,j),$$ 类似地,若$n=2m+1$是奇数,则组合前m位、后m位和中间一位得 $$T^*(n)=\sum_{j=1}^{9m}10^{m+2}\cdot s^*(m,j)\cdot c(m,j)+10\cdot s(m,j)\cdot c^*(m,j)+45\cdot10^m\cdot c^*(m,j)\cdot c(m,j).$$ 递推计算即得结果$6273134$。

c=[[0]*208 for i in range(24)]
s=[[0]*208 for i in range(24)]
c2=[[0]*208 for i in range(24)]
s2=[[0]*208 for i in range(24)]
for j in range(10):
    c[1][j]=c2[1][j]=1
    s[1][j]=s2[1][j]=j
for i in range(2,24):
    for j in range(9*i+1):
        c[i][j]=sum(c[i-1][j-k] for k in range(min(10,j+1)))
        s[i][j]=sum(10*s[i-1][j-k]+k*c[i-1][j-k] for k in range(min(10,j+1)))
        c2[i][j]=c[i][j]-c[i-1][j]
        s2[i][j]=s[i][j]-s[i-1][j]

z=3**15
r=45
for n in range(2,48):
    m=n/2
    x=pow(10,m,z)
    if n%2==0:
        r+=sum((x*s2[m][j]*c[m][j]+s[m][j]*c2[m][j])%z for j in range(1,9*m+1))%z
    else:
        r+=sum((100*x*s2[m][j]*c[m][j]+10*s[m][j]*c2[m][j]+45*x*c[m][j]*c2[m][j])%z for j in range(1,9*m+1))%z

print r%z