【模板】生成函数

例如,我们有一个数列{1,6,4,8,5},我们考虑用一个函数来表示这个数列。

\(g(x)\)=\(1\)+\(6x^1\)+\(4x^2\)+\(8x^3\)+\(5x^4\)

在这个函数中,每一项的系数为数列中的数,每一项的未知数\(x\)的指数\(i\)代表了这一项的系数是原数列的\(i+1\)项。
那么这个可以做什么呢?
他可以求一类类似背包的题。
比如说:

有A,B两种物品,A种物品至多取2个,B种物品的取得个数必须是5的倍数。请问A,B两种物品的个数加起来的数量为n的方案数。

答案的函数就是:

\(g(x)\)=\((1+x^1+x^2)\)\((1+x^5+x^{10}...)\)

问:这个函数的第n项是什么?
很明显这个函数可以FFT。
但是,在\(-1<x<1\)时这些多项式可以化简。
例如:
第一个多项式直接等比数列求和。

\(1+x^k+x^{2k}+...+x^{(n-1)k}\)=\(\frac{1-x^{n}}{1-x^k}\)

第二项也可以化简。

\(1+x^5+x^{10}...\)=\(\frac{1}{1-x^5}\)

这个式子原来是\(\frac{1-x^n}{1-x^5}\),n越大,\(x^n\)就无限逼近于零,所以是\(\frac{1}{1-x^5}\)

一般的生成函数模板题都是化简完后,剩下\(\frac{1}{(1-x)^k}\),那么这个式子又能化成什么呢?

这个其实是\(k\)个\(\frac{1}{1-x}\)相乘,也就是\(k\)个\((1+x^1+x^2...)\)相乘,用插板法,指数为i的项的系数就是\(C_{i+k-1}^{k-1}\)。

推荐题目:
【BZOJ3771】Triple
洛谷P2000 拯救世界

原文地址:https://www.cnblogs.com/2017gdgzoi44/p/11485557.html

时间: 2024-10-23 02:43:59

【模板】生成函数的相关文章

C++函数模板的使用

函数模板: 函数模板是函数的蓝图或处方,编译器使用它生成函数系列的新成员.新函数在第一次使用时创建.从函数模板中生成的函数称为该模板的一个实例或模板的实例化.函数模板的开头是关键字template,表示这是一个模板.其后是一对尖括号,它包含了参数列表.在使用从模板中生成的函数之前,必须确保把声明(即原型)或模板的定义放在源文件中.模板的实例化只生成一次.如果后续的函数调用需要同一个实例,就会调用已经创建好的实例,即使同一个实例在不同的源文件中生成,程序也仅会包含该实例定义的一个副本.使用时需要注

C++使用函数模板

函数模板: 函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员. 第一次使用时,新的功能是创建.从功能模板生成的函数的实例称为模板或模板的实例.函数模板的开始是keywordtemplate,表示这是一个模板. 其后是一对尖括号,它包括了參数列表. 在使用从模板中生成的函数之前,必须确保把声明(即原型)或模板的定义放在源文件里.模板的实例化仅仅生成一次. 假设兴许的函数调用须要同一个实例,就会调用已经创建好的实例,即使同一个实例在不同的源文件里生成,程序也仅会包括该实例定义的一个副本.

函数模板注意事项

一.模板重载 ①和常规重载一样,被重载的模板的函数特征标必须不同. ②并非所有的模板参数都必须是模板参数类型.例如: template<class T> void swap(T& a,T& b); template<class T> void swap(T* a,T* b,int n);//第三个参数类型为具体类型int,而不是通用类型 二.显示具体化 对于某些类型的参数,我们的算法可能略有不同,比如:对于一个结构体,虽然将一个结构体赋给另一个结构体是允许的,但是,

函数探幽

函数探幽 内联函数 c++为提高程序运行速度的一项改进. 非内联函数在调用时来回跳跃并记录产生了一定的开销. 内联函数编译器将使用相应的函数代码替换函数调用.无需跳到另一个位置去执行代码. 内联函数运行速度比常规函数稍快,但代价是占用更多内存. 如果程序在10个不同的地方调用同一个内联函数,该程序将包含该函数代码的10个副本. 如果执行函数代码时间比函数调用时间短,则应该使用内联函数. 要使用内联函数需要在函数声明和定义前加上inline关键字. 通常的做法是省略声明,直接定义. 有些函数即使声

软件工程-个人项目(一) 数独终局的一些想法

任务:实现一个能过生成数独终局并且能求解数独问题的控制台程序. 代码地址:https://github.com/MrFasl/1120172188 使用语言:C++ 每个数独终局包含9*9个数字,第一个字母为(8+8)%9+1 = 8,即每个数独终局第一个数字均为8 关于数独终局数量的考虑: 数量要求为1<=N<=1000000 = 1e6  在首个数字固定的情况下,第一行可用的组合有8!= 40320种 <1e6. 现在考虑如何扩充数量,由于第一行不能改变,所以考虑456行和789行的

找单词 HDU2082(生成函数模板)

题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33.(组成的单词与排列顺序无关,比如ACM与CMA认为是同一个单词) 思路: 显然是一个多重集组合问题,应该用普通的生成函数来求解 构造\(G(x)=(1+x^1+x^2

C++学习笔记30:模板与型式参数化

转型操作 接受目标型式作为模板参数 Programmer *p = dynamic_cast<Programmer*>(e) 模板工作原理 使用template<typename T>定义函数模板或者类模板 体化(instantiation):使用特定的模板实际参数,生成真正的模板函数和模板类 编译模板类和模板函数,生成最终的程序代码 模板代码 一般放在头文件中:编译器需要看到模板源文件 模板的特点: 抽象性:模板代码高度抽象,是函数和类的模范 安全性:型式检查能够发现大多数型式失

母函数入门+模板(转)

在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的方法称为母函数方法. 母函数可分为很多种,包括普通母函数.指数母函数.L级数.贝尔级数和狄利克雷级数.对每个序列都可以写出以上每个类型的一个母函数.构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型. 这里先给出两句话,不懂的可以等看完这篇文章再回过头来看: 1.“把组合问题的加法法则和幂级数

【小结】SG生成函数(Grundy函数)

SG生成函数(Grundy函数)小结 转移到子游戏x&y,则 sg[now]=sg[x]∧sg[y] 模板 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 100007; const int MAX_S = 128; const int MAX_X = MAX; int sg[MAX], stone[MAX_S]; int