生成函数练习

贴一点生成函数的前置知识麦克劳林展开

能直接求得指定指数的系数,生成函数就好做了。

食物

链接:https://www.acwing.com/problem/content/3135/

大意

给定一些食物携带个数的限制,求携带n件食物有多少种方案。

思路

生成函数板题,写出每种食物的生成函数,相乘抵消,求得指数为n时的系数。

函数如下

承德汉堡: 1 + x 2 + x 4 + . . . + x 2 k + . . . = 1 1 − x 2 1 + x^2 + x^4 + ... + x^{2k} + ... = \frac{1}{1-x^2} 1+x2+x4+...+x2k+...=1x21

可乐: 1 + x = 1 − x 2 1 − x 1+x=\frac{1-x^2}{1-x} 1+x=1x1x2

鸡腿: 1 + x + x 2 = 1 − x 3 1 − x 1+x+x^2=\frac{1-x^3}{1-x} 1+x+x2=1x1x3

蜜桃多: x 1 + x 3 + . . . + x 2 k + 1 + . . . = x 1 − x 2 x^1 + x^3 + ... + x^{2k+1} + ... = \frac{x}{1-x^2} x1+x3+...+x2k+1+...=1x2x

鸡块: 1 + x 4 + x 8 + . . . + x 4 k + . . . = 1 1 − x 4 1 + x^4 + x^8 + ... + x^{4k} + ... = \frac{1}{1-x^4} 1+x4+x8+...+x4k+...=1x41

包子: 1 + x + x 2 + x 3 = 1 − x 4 1 − x 1+x+x^2+x^3=\frac{1-x^4}{1-x} 1+x+x2+x3=1x1x4

土豆片炒肉: 1 + x = 1 − x 2 1 − x 1+x=\frac{1-x^2}{1-x} 1+x=1x1x2

面包: 1 + x 3 + x 6 + . . . + x 3 k + . . . = 1 1 − x 3 1 + x^3 + x^6 + ... + x^{3k} + ... = \frac{1}{1-x^3} 1+x3+x6+...+x3k+...=1x31

全部相乘后得到 x ( 1 − x ) 4 \frac{x}{(1-x)^4} (1x)4x

这就可以用到上面的麦克劳林展开了,我们最终得到 ∑ k = 0 ∞ C k + 3 3 ∗ x k + 1 \sum_{k=0}^∞ C _{k+3}^3* x^{k+1} k=0Ck+33xk+1

令k+1=n,得到k=n-1;

最终得到公式 C n + 2 3 C_{n+2}^3 Cn+23

CODE

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n=0;
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        n=(n*10+s[i]-'0')%10007;
    }
    cout<<n*(n+1)*(n+2)/6%10007<<endl;
    return 0;
}

Link with Balls——2021杭电中超第七场

链接:https://acm.hdu.edu.cn/showproblem.php?pid=7047

大意

有2*n个盒子,两种盒子每种n个:

第一种第i个盒子可以取ik个球(k∈N)

第二种第i个盒子可以取不超过i个球。

求取m个球有多少种方案。

思路

生成函数的思想,第一种第i个盒子的函数为 1 + x i + x 2 i + x 3 i + . . . + x k i + . . . = 1 1 − x i 1+x^i+ x^{2i}+ x^{3i}+... +x^{ki}+...=\frac{1}{1-x^i} 1+xi+x2i+x3i+...+xki+...=1xi1

第一种第i个盒子的函数为 1 + x 1 + x 2 + x 3 + . . . + x i = 1 − x i + 1 1 − x 1+x^1+ x^{2}+ x^{3}+... +x^{i}=\frac{1-x ^{i+1}}{1-x} 1+x1+x2+x3+...+xi=1x1xi+1

2n个盒子函数相乘抵消得到 ( 1 − x n + 1 ) ∗ ( 1 1 − x ) n + 1 (1-x^{n+1})*(\frac{1}{1-x})^{n+1} (1xn+1)(1x1)n+1

麦克劳伦展开 ∑ k = 0 ∞ C i + n n ∗ x k − ∑ k = 0 ∞ C i + n n ∗ x k + n + 1 \sum_{k=0}^∞ C _{i+n}^n* x^{k}-\sum_{k=0}^∞ C _{i+n}^n* x^{k+n+1} k=0Ci+nnxkk=0Ci+nnxk+n+1

令左边k=m 右边k+n+1=m分别得到k=m 和 k=m-n-1

所以我们有最终公式

C m + n n − C m − 1 n C_{m+n}^n-C_{m-1}^n Cm+nnCm1n

CODE

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e2+10;
const double eps=1e-6;
const ll mod = 1e9+7;
ll fac[2000007];
ll ksm(ll x,ll p){
    ll res=1;
    while(p){
        if(p%2==1) res=res*x%mod;
        p/=2;
        x=x*x%mod;
    }
    return res;
}
ll inv(ll a) {
	return ksm(a,mod-2)%mod;
}
void solve() {
	fac[0] = 1;
	for(int i = 1;i < 2000006; i++) {
		fac[i] = (fac[i-1]*i)%mod;
	}
}
ll comb(ll n,ll k){
	if(k>n)return 0;
	if(k==1)return n;
	return (fac[n]*inv(fac[k])%mod*inv(fac[n-k])%mod);
}
int main()
{
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    solve();
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        cout<<(comb(m+n,n)-comb(m-1,n)+mod)%mod<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第十页

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值