母函数

很神奇的一个东西嘞

问题:现在有1克,2克,3克,4克砝码各一个,可以选出几种重量?

这里我们用母函数来实现

对 一 克 的 砝 码 来 说 , 不 选 记 作 是 x 0 , 也 就 是 1 , 选 的 话 记 作 是 x 1 对一克的砝码来说,不选记作是x^0,也就是1,选的话记作是x^1 对一克的砝码来说,不选记作是x0,也就是1,选的话记作是x1

对 两 克 的 砝 码 来 说 , 不 选 记 作 是 x 0 , 也 就 是 1 , 选 的 话 记 作 是 x 2 对两克的砝码来说,不选记作是x^0,也就是1,选的话记作是x^2 对两克的砝码来说,不选记作是x0,也就是1,选的话记作是x2

. . . . . . . ....... .......

一 此 类 推 , x 的 指 数 代 表 的 是 这 个 砝 码 的 重 量 , x 的 系 数 是 选 择 方 案 一此类推,x的指数代表的是这个砝码的重量,x的系数是选择方案 一此类推,x的指数代表的是这个砝码的重量,x的系数是选择方案

那么看这个式子 ( 1 + x ) ∗ ( 1 + x 2 ) ∗ ( 1 + x 3 ) ( 1 + x 4 ) (1+x)*(1+x^2)*(1+x^3)(1+x^4) (1+x)∗(1+x2)∗(1+x3)(1+x4)

把 这 个 式 子 展 开 , 你 会 发 现 x n 前 面 的 系 数 就 是 凑 成 重 量 n 砝 码 的 方 案 数 把这个式子展开,你会发现x^{n}前面的系数就是凑成重量n砝码的方案数 把这个式子展开,你会发现xn前面的系数就是凑成重量n砝码的方案数

神 奇 吗 ? 这 其 实 是 幂 函 数 的 功 效 神奇吗?这其实是幂函数的功效 神奇吗?这其实是幂函数的功效

因 为 凑 成 方 案 , 方 案 数 是 相 乘 的 , 而 重 量 是 相 加 因为凑成方案,方案数是相乘的,而重量是相加 因为凑成方案,方案数是相乘的,而重量是相加

那 么 我 们 用 系 数 表 示 方 案 数 , 用 指 数 表 示 重 量 , 这 样 多 项 式 就 可 以 进 行 组 合 了 那么我们用系数表示方案数,用指数表示重量,这样多项式就可以进行组合了 那么我们用系数表示方案数,用指数表示重量,这样多项式就可以进行组合了

算法就是模拟上面一个个括号的乘积而已

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int t,n,c1[maxn],c2[maxn];
int main()
{
while( cin >> n )//用[1,n]克的无限个砝码凑成n
{
for(int i=0;i<=n;i++) c1[i]=1,c2[i]=0;//c1是当前括号内的系数
for(int i=2;i<=n;i++)
{
for(int j=0;j<=n;j++)
for(int k=0;k+j<=n;k+=i)
c2[j+k]+=c1[j];
for(int j=0;j<=n;j++)
c1[j]=c2[j],c2[j]=0;
}
cout << c1[n] << '\n';
}
}