幸运票
* * * *
拉格朗日计划
* * * *
幸运票

俄罗斯的公交车票上有六位数字,前三位之和与后三位之和相同的票称为幸运票。

显然这一概念也可以推广到任意进制下具有偶数位的车票系统。

每个输入数据都是一个字符串中,串中是由一个空格隔开的两个自然数,第一个数$2\le d\le 14$表示车票位数,第二个数$2\le b\le 16$表示进制。

对每条输入数据,打印(单独占一行)出在相应的车票系统中共有多少张幸运票。

本题难度:



解答

比较典型的动态规划问题。

用$c_{i,k}$表示各位数字之和为k的i位b进制数的总数,并记$m=d/2$。

前m位等于后m位等于k的d位车票共有$c_{m,k}^2$种情况(前m位和后m位各$c_{m,k}$种选择)。

一个i位b进制数,各位数字之和最小是0,最大是$i(b-1)$,共$i(b-1)+1$种情况。

因此幸运票总数是$\sum_{k=0}^{m(b-1)+1}c_{m,k}^2$

$c_{i,k}$可以递推计算: $$c_{i,k}=\sum_{j=0}^{b-1} c_{i-1,k-j}$$ 最终代码有五行。

代码长度:185字节 vs. 全站第一:98字节。

import sys
for a in sys.argv[1:]:
  d,b=map(int,a.split());c,i=[1]*b,2
  while i<=d//2:c=[sum(x*(0<=j-k<b)for k,x in enumerate(c))for j in range(i*b-i+1)];i+=1
  print(sum(i*i for i in c))