背包
背包
https://ac.nowcoder.com/acm/problem/207746
此题用生成函数解决。
思路
考虑每一个要求的生成函数。(只选条件中的物品)
x的第i次项的系数表示选i个有多少种可能(1看作x^0)("^"看作次方)
(0<x<1) ;c(m,n)=n!/(m!*(n-m)!)
条件一:(肥宅快乐水)1+x
条件二:(大盘鸡)1+x+x^2
条件三:(啤酒鸡)1+x+x^2+x^3
条件四:(鸡翅)1+x^2+x^4+......
条件五:(鸡汤)x+x^3+x^5+......
条件六:(鸡块)1+x^4+x^8+......
条件七:(鸡腿)1+x
条件八:(鸡蛋)1+x^3+x^6+......
化简
1+x+x^2+......+x^n=( 1-x^(n+1) )/(1-x)(等比数列求和)
当 (0<x<1) 且 n=正无穷时
所以 ( 1-x^(无穷) )/(1-x)= 1/(1-x)
每个条件化简后:
条件一:(肥宅快乐水)1+x
条件二:(大盘鸡)
条件三:(啤酒鸡)
条件四:(鸡翅)1/(1-x^2)
条件五:(鸡汤)x/(1-x^2)
条件六:(鸡块)1/(1-x^4)
条件七:(鸡腿)1+x
条件八:(鸡蛋)1/(1-x^3)
然后把八个条件乘起来 ,
化简后:g(x)=x/(1-x)^4=x*(1+x+......+x^n)^4
看引用内容部分
再化简后:
g(x)=x( c(0,3)1+c(1,4)x+......+c(n,n+3)*x^n)
= c(0,3)x+c(1,4)x^2+......+c(n,n+3)*x^(n+1)
所以选k个的方案数为 c(k-1,k+2)即( (k+2)! )/( ( (k-1)! )*(3!) )
最后求一下3!的逆元就行了
#include<cstdio> #define ll long long const ll p=1e9+7; int main() { ll n;scanf("%lld",&n);n%=p; printf("%lld",1ll*n*(n+1)%p*(n+2)%p*166666668%p); return 0; }