背包

背包

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;
}
全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
没有offer的小土豆:专业面试一般是分配面试官然后联系你面试 应该是还没给你分配对应面试官
点赞 评论 收藏
分享
评论
8
收藏
分享
牛客网
牛客企业服务