BZOJ 3028: 食物
3028: 食物
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 506 Solved: 338
[Submit][Status][Discuss]
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}+x^{6}+……=\frac {1}{1-x^{2}}$
可乐:
$1+x$
鸡腿:
$1+x+x^{2}=\frac {1-x^{3}}{1-x}$
蜜桃多:
$x+x^{3}+x^{5}+x^{7}+……=\frac {x}{1-x^{2}}$
鸡块:
$1+x^{4}+x^{8}+……=\frac {1}{1-x^{4}}$
包子:
$1+x+x^{2}+x^{3}=(1+x)(1+x^{2})$
土豆片炒肉:
$1+x$
面包:
$1+x^{3}+x^{6}+……=\frac {1}{1-x^{3}}$
然后乘起来化简一下可以得到:$\frac {x}{(1-x)^{4}}$
根据广义二项式定理:
$f(x)= \frac {x}{(1-x)^{4}}$
$=x(1-x)^{-4}$
$=x \sum _{k=0}^{∞} \textrm{C}_{4+k-1}^{k} x^{k}$
$=x \sum _{k=0}^{∞} \textrm{C}_{k+3}^{3} x^{k}$
所以$x^{n}$的$n$次方项的系数为$\textrm{C}_{n+2}^{3}$
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn using namespace std; const int maxn=500+5,mod=10007; int n; char s[maxn]; inline int power(int x,int y){ int ans=1; while(y){ if(y&1) (ans*=x)%=mod; (x*=x)%=mod,y>>=1; } return ans; } signed main(void){ scanf("%s",s);n=0; for(int i=0;s[i];i++) n=(n*10%mod+s[i]-'0')%mod; printf("%d\n",n*(n+1)%mod*(n+2)%mod*power(6,mod-2)%mod); return 0; }
By NeighThorn