BZOJ3028 - 食物

BZOJ3028 - Click Here

  

Description

  明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等当然,他又有一些稀奇古怪的限制:每种食物的限制如下:

  承德汉堡:偶数个

  可乐:0个或1个

  鸡腿:0个,1个或2个

  蜜桃多:奇数个

  鸡块:4的倍数个

  包子:0个,1个,2个或3个

  土豆片炒肉:不超过一个

  面包:3的倍数个

  注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以个为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。

  

Input

  输入一个数字N,1<=n<=10^500

  

Output

  如题

  

Solutions

  显然可得答案$\binom{n+2}{3}$,毫无思维难度!

  ……开玩笑的……怎么可能……

  

  根据题意,可以构造出每个物品的生成函数。

  承德汉堡:$\sum_{0 \leq k} x^{2k} = \frac{1}{1-x^2}$

  可乐:$1+x$

  鸡腿:$1+x+x^2 = \frac{1-x^3}{1-x}$

  蜜桃多:$\sum_{0 \leq k} x^{2k+1} = \frac{x}{1-x^2}$

  鸡块:$\sum_{0 \leq k} x^{4k} = \frac{1}{1-x^4}$

  包子:$1+x+x^2+x^3=\frac{1-x^4}{1-x}$

  土豆片炒肉:$1+x$

  面包:$\sum_{0 \leq k} x^{3k} = \frac{1}{1-x^3}$

  把上面全部乘起来就得到答案的生成函数$F(x)=\frac{x}{(1-x)^4}$

  题目要求的答案就是$[x^n]F(x)$,因此只需要展开$F(x)$即可求解。

  

  至于如何展开,这里提供两种方法。

  (1)二项展开式

  $F(x)=x \cdot (1-x)^{-4}$,$(1-x)^{-4}$可以利用二项展开式得到$\sum \binom{-4}{k} \cdot (-1)^{k} \cdot x^k$

  因此$F(x)=\sum \binom{-4}{k}x^{k+1}$,此时$[x^n]F(x) = \binom{-4}{n-1} \cdot (-1)^{n-1}$

  对上指标变换一下,得到$[x^n]F(x) = \binom{n+2}{n-1} = \binom{n+2}{3}$

  

  (2)泰勒展开式

  可以直接对$F(x)$关于$x=0$泰勒展开(即麦克劳林公式),此时得到$[x^n]F(x)=\frac{F^{(n)}(x)}{n!}$

  因此现在的问题是求出$F(x)$的$n$阶导数。

  

  首先定义$G(x)=x , \, H(x)=(1-x)^{-4}$,则$F(x)=G(x)H(x)$

  根据莱布尼茨公式可得$F^{(n)}(x) = \sum_{i=0}^n \binom{n}{i}G^{(i)}(x) \cdot H^{(n-i)}(x)$

  又由于当$i>1$时,$G^{(i)}(x)=0$。因此可得$F^{(n)}(x)=xH^{(n)}(x)+nH^{(n-1)}(x)$

  即$F^{(n)}(x) = \frac{(n+3)!}{3!}x(1-x)^{-4-n} + \frac{(n+2)!}{3!}n(1-x)^{-n-3}$

  将上式带入$\frac{F^{(n)}(0)}{n!}$就得到了$\binom{n+2}{3}$

  

  然后,下指标那么小,直接求出乘法逆元计算就好了。

  

CODE

CODE - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang