BZOJ 3028食物

来源:互联网 发布:将java工程打包成exe 编辑:程序博客网 时间:2024/04/28 20:15
 由于该题网上只有一篇题解,还是萎的,所以写一篇
该题解在本人QQ空间和CSDN里都有

3028: 食物

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 89  Solved: 47
[Submit][Status]

Description

明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!

我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。

他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等

当然,他又有一些稀奇古怪的限制:

每种食物的限制如下:

       承德汉堡:偶数个

       可乐:0个或1

            鸡腿:0个,1个或2

            蜜桃多:奇数个

            鸡块:4的倍数个

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

       土豆片炒肉:不超过一个。

            面包:3的倍数个

 

 

 

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

 

Input

输入样例1

  1

输出样例1

  1

 

输入样例2

  5

输出样例2

  35

 数据范围

   对于40%的数据,1<=N<=100000;

   对于所有数据,1<=n<=10^500;

 

Output

Sample Input

 

Sample Output

 

HINT

 

Source

 

首先列出所有食物的母函数

汉堡:1+x^2+x^4+.....=1/(1-x^2)

可乐:1+x

鸡腿:1+x+x^2

蜜桃多:x+x^3+x^5+.....=x/(1-x^2)

鸡块:1+x^4+x^8+....=1/(1-x^4)

包子:1+x+x^2+x^3

土豆:1+x

面包:1+x^3+x^6+...=1/(1-x^3)

母函数有一个很有用的用处:把所有食物的母函数相乘后,x^n项的系数就是答案

 

 

解法一:

那么我们把母函数相乘

[1/(1-x^2)]*(1+x)*(1+x+x^2)* [x/(1-x^2)]*[1/(1-x^4)] *[1+x+x^2+x^3]*[(1+x)]*[1/(1-x^3)]

化简后得到 x/(1-x)^4,过程略,化简主要用到的公式平方差公式和:1+x+x^2+x^3+......x^n=(x^(n+1)-1)/(x-1)还有:1+x+x^2+x^3+...x^(无限)=1/(1-x)

 

x/(1-x)^4 =x*(1/(1-x)^4)

  =x*(1+x+x^2+x^3+x^4+.....x^(无限))^4

     =x*((1+x+x^2+x^3+x^4+.....x^(无限))^2)^2

现在计算(1+x+x^2+x^3+x^4+.....x^(无限))^2

显然可得(1+x+x^2+x^3+x^4+.....x^(无限))^2=1+2x+3x^2+4x^3+......x^(无限)

显然这个多项式中系数是指数+1

然后可以计算1(1-x)^4

x/(1-x)^4=x*(1+x+x^2+x^3+x^4+.....x^(无限))^4

   =x*((1+x+x^2+x^3+x^4+.....x^(无限))^2)^2

   =x*(1+2x+3x^2+4x^3+......x^(无限))^2

根据多项式乘法的定义

A,B,C3个多项式 F(A,I)表示多项式Ax^i项的系数

A*B=C

F(C,X)=(F(A,K)*F(B,X-K))   {K=0....X}

A=B=1+2x+3x^2+4x^3+......x^(无限)

那么F(C,N-1)就是我们要求的答案

(注:由于x*(1/(1-x)^4),外面乘了个x,所以我们求的是F(C,N-1)而不是F(C,N)

观察1+2x+3x^2+4x^3+......x^(无限)的特性可知:

F(A,X)=X+1  F(B,X)=X+1

那么F(C,N-1)=(F(A,K)*F(B,N-1-K))   {K=0....N-1}

      =((K+1)*(N-1-K+1))     {K=0....N-1}

   =((K+1)*(N-K))

   =(K*N-K^2+N-K)

   =(K*N)-(K^2)+(N-K)

   =(N*N*(N-1)/2)-(N*(N-1)*(2N-1)/6)+(N(N+1)/2)

   =(N(N^2+1)/2)-(N*(N-1)*(2N-1)/6)

   =(N(N^2+3N+2)/6)

   =N(N+1)(N+2)/6

然后逆元什么的搞搞就好了

解法二:

如果有公式恐惧症的话,下面提供Stilwell大神的一种较清晰的解法

x*(1+x+x^2+x^3+x^4+.....x^(无限))^4

可以发现其中(1+x+x^2+x^3+x^4+.....x^(无限))^4x^n项的系数为:将n整数划分成4个自然数的方案数

然后用类似插板一样的东西就行了

0 0
原创粉丝点击