该题是微软编程之美2015测试赛的第二题,题意大概是这样的:

三类纪念品,每类纪念品有种。第种纪念品分别记作,它们的价值均为),且分别有个剩余。现在希望从这三类纪念品种各选一个,但不能有两个纪念品的价值相同而另一个价值不同,即要么三个纪念品的价值一样,要么各不一样。问给定,有多少种选择方案?求出方案数模的结果。范围限制:.

分析:用表示选择价值为的纪念品、价值为的纪念品和价值为的纪念品,对应于的选择方案数有多个,用表示:

再设表示满足题目要求的总的方案数量(是关于的函数),则有:

记法的含义是:

对上面的式子进行转化,消去以便运算:

上式中最后加上了三个纪念品价值相同的情况,因为在减去两个纪念品价值相同的方案数时把三个纪念品价值相同的方案数也减去了。根据的定义注意到

因此

有兴趣的读者可以自行演算下去,这儿不给出后续推导过程了,最后的结果为

结果中是因为当时上式给出的结果不正确。或许本题有更好的思路,手工推导公式的过程容易出错,但好处是一旦得到关于的公式,计算起来就很方便了,当非常大时尤其如此。

参考

Concrete Mathematics, a foundation for computer science by Graham, Knuth and Patashnik. 2th ed. 第二章