算法学习 母函数

母函数又称生成函数。定义是给出序列:a0,a1,a2,.......ak,......,那么函数G(x)=a0+a1*x+a2*x2+......ak*xk称为序列a0,a1,a2,.......ak,......的母函数(即生成函数)。

例如:序列1,2,3.......n的生成函数为:G(x)=x+2x2+3x3+........nxn。点此链接:百度百科

特别的当序列为:1,1,1,1,.......1,这个生成函数为:G(x)=x+x2+x3+.......+xn=(1-xn)/(1-x),当-1<x<1时G(x)=1/(1-x)

1/(1-x)n=1+C(n,1)x+C(n+1,2)x2+C(n+2,3)x3+...+C(n+k-1,k)xk+...可以把生成函数还原为数列。

==========================================================================================================================

例 1:使用母函数求出斐波那契数列的通项公式。Fib(n)=Fib(n-1)+Fib(n-2),这里假设Fib(1)=1,Fib(2)=1;

求解这种递推关系的方法是:①、将递推关系变成母函数方程;②、求解母函数方程;③、将母函数变成幂级数形式。

所以斐波那契数列的生成函数为:G(x)=x+x2+2x3+3x4+5x5+8x6..........。

等式两边同时*x有:xG(x)=x2+x3+2x4+3x5+5x6+8x7+.......。

相加有:G(x)+xG(x)=x+2x2+3x3+5x4+8x5+13x6+........。

我们对比G(x)可以得到:G(x)+xG(x)=G(x)/x-1;所以我们可以得到:G(x)=x/(1-x-x2)。

可以令:1-x-x2=0,得到两根为:a=(1-√5)/2,b=(1+√5)/2,所以我们可以知道:1-x-x2=(x-x1)(x-x2)=(1-ax)(1-bx);

假设x/(1-x-x2)=m/(1-ax)+n/(1-bx),通分有:x=m(1-bx)+n(1-ax).由系数关系可得m=-1/√5,n=1/√5,所以G(x)=-1/√5(1-bx)+1/√5(1-ax)。

我们可知:1/(1-bx)=1/[1-(1+√5)/2x]是以公比为(1+√5)/2的等比数列,1/(1-ax)是以公比为(1-√5)/2的等比数列,所以其通项公式为:Fib(n)=1/√5[bn+1-an+1]。

==========================================================================================================================

例题2:若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案?

构造母函数,如果用x的指数表示称出的重量,则:
1个1克的砝码可以用函数1+x表示,(前面的这个1表示1克的砝码个数为0)
1个2克的砝码可以用函数1+x2表示,
1个3克的砝码可以用函数1+x3表示,
1个4克的砝码可以用函数1+x4表示,

那么几种砝码的组合情况的用乘积表示有:(1+x)(1+x2)(1+x3)(1+x4)=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10 ,系数即为方案数。

例称出重量为6的物品:①、1,2,3;②、2,4两种方案。

==========================================================================================================================

例题3:求用1分、2分、3分的邮票贴出不同数值的方案数?

这个相对于上面的那个例子是:这个邮票可以重复。可知其生成函数为:G(x)=(1+x+x2+....)(1+x2+x4+....)(1+x3+x6+...),同理展开后其系数即为方案数。

==========================================================================================================================

例题4:德.梅其里亚克称重问题

(1)重为a1,a2,a3.....ak的砝码,如何放在天平的两端,记可称重量为n的物体的不同方式为Cn,则Cn的母函数为:

G(x)=(x-a1+1+xa1)(x-a2+1+xa2).........(x-ak+1+xak) ------ x-a1表示砝码a1和物体放在同一个托盘内,xa1表示砝码和物体放在不同的托盘内,1则为不用这个砝码。

(2)重为a1,a2,a3....ak的砝码,如只可以放在天平的一端,记可称重量为n的物体的不同方式为Cn,则Cn的母函数为:

G(x)=(1+xa1)(1+xa2).........(1+xak)

==========================================================================================================================

例题5:数的划分,将整数分解为若干个整数(相当于将n个苹果放在n个无区别的盘子里,每个盘子可以放多个,也可以不放),上一篇博文中有提到。

假设1出现的次数为记为a1,2出现的次数记为a2.........k出现的次数记为ak,那么生成函数为:

G(x)=(1+x+x2+x3+x4+.....)(1+x2+x4+x6+x8+......)(1+x3+x6+x9+....)........(1+xn)

前面的1+x2+x4+x6+x8+......意思是当出现一个2时为x2,当出现两个2时为x4.....,为什么当出现n时,只有两项(1+xn),因为是将数n划分为若干项,所以不能超过该数,且由数1到n项数依次要<=n/k(k=1.2,3,4...n)。

还是以nyist 90(数的划分)为例:这里就直接套用网上的模板了

#include<iostream>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
const int MAX=50;  
#define CLR(arr,val) memset(arr,val,sizeof(arr))  
int n,m,value[MAX],temp[MAX];  
int main()  
{   cin>>m;  while(m--)  {   cin>>n;  fill(value,value+MAX,1);//value用来存储系数   CLR(temp,0);//temp用来保存每一次的情况  for(int i=2;i<=n;i++)                                                          {   for(int j=0;j<=n;j++)  for(int k=0;k+j<=n;k+=i) //控制每次系数的变化和每个数出现的最大项数   temp[k+j]+=value[j];    for(int j=0;j<=n;j++)  value[j]=temp[j],temp[j]=0;  }  cout<<value[n]<<endl;   }  return 0;  
}  

 

 例题2:hdu 1085(硬币问题)

//有3种面额是1、2、5的硬币,输入3个数字代表每种硬币的枚数,求最小的不能由这些硬币组成的面额是多少?  
#include<iostream>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
const int MAX=8010;  
#define CLR(arr,val) memset(arr,val,sizeof(arr))  
int value[MAX],temp[MAX],num[3],coin[3]={1,2,5};  
int main()  
{   while(cin>>num[0]>>num[1]>>num[2])  {   if(num[0]+num[1]+num[2]==0) break;  int max=num[0]+2*num[1]+5*num[2];  CLR(value,0);  CLR(temp,0);  fill(value,value+num[0]+1,1);  for(int i=1;i<3;i++)  {   for(int j=0;j<=max;j++)  for(int k=0;k+j<=max&&k/coin[i]<=num[i];k+=coin[i])//注意不能超出个数  temp[k+j]+=value[j];  for(j=0;j<=max;j++)  value[j]=temp[j],temp[j]=0;  }  for(i=0;i<=max+1;i++)//遍历即可  if(value[i]==0) {cout<<i<<endl;break;}  }  return 0;  
}  

涉及到母函数的题目有:HDU 1171,1398,1709,2065,2069,2082,2152;POJ 3046,3716,3734等等~有空再做下

转自https://www.cnblogs.com/13224ACMer/p/4671551.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

plsq卸载 删除注册表、_win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结...

win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结一&#xff1a;前提注意&#xff1a;现在有两种安装的方式1. oracle11g服务端(64位)oracle客户端(32位)plsql(32位)2. oracle11g服务端(32位)plsql(32位)这里我选择的是第二种 原因是 &#xff1a;首先需要明确ora…

【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)

Fibonacci Problem Description 2007年到来了。经过2006年一年的修炼&#xff0c;数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]0,f[1]1;f[i] f[i-1]f[i-2](i>2))的值全部给背了下来。 接下来&#xff0c;CodeStar决定要考考他&#xff0c;于是每问他一个数字&a…

java sqlserver分页查询_实现sqlserver分页查询语句

实现sqlserver分页查询语句sqlServer&#xff1a;一次查询&#xff0c;数据库只返回一页的数据。而不是取出所有的数据。pagesize&#xff1a; 每页显示记录数cureentpage&#xff1a;当前页数select * from ( select TOP pagesize * from ( SELECT TOP pagesize*cureentpage…

【HDU - 1269】迷宫城堡 (tarjan算法模板)

题干&#xff1a; 为了训练小希的方向感&#xff0c;Gardon建立了一座大城堡&#xff0c;里面有N个房间(N<10000)和M条通道(M<100000)&#xff0c;每个通道都是单向的&#xff0c;就是说若称某通道连通了A房间和B房间&#xff0c;只说明可以通过这个通道由A房间到达B房间…

php5.4 curl,PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析

本文实例分析了PHP5.0~5.6 各版本兼容性cURL文件上传功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近做的一个需求&#xff0c;要通过PHP调用cURL&#xff0c;以multipart/form-data格式上传文件。踩坑若干&#xff0c;够一篇文章了。重要警告没事不要读PHP的…

【HDU - 1518】Square (经典的dfs + 剪枝)

题干&#xff1a; Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the number of test cases. Each test case begins with an integer 4 < M < 20, the number …

php发扑克牌,php 扑克牌代码的简单例子

本文分享下&#xff0c;一段可模拟扑克牌玩法的php代码&#xff0c;有需要的朋友参考下。php 扑克牌代码&#xff0c;如下&#xff1a;cut();* www: jbxue.com*/class cards{/**** Declare our deck variable**/private $deck;/**** Constructor.. duh!**/function __construct…

【HDU - 1026 】Ignatius and the Princess I (bfs + 记录路径)

题干&#xff1a; The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166s castle. The castle is a large labyrinth. To make the problem simply, we assume the labyrinth is a N*…

php多线程模拟请求,浅谈php使用curl模拟多线程发送请求

每个PHP文件的执行是单线程的&#xff0c;但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程&#xff0c;这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容&#xff0c;这里举一个demo来模拟一次curl多线程并发操作。//设…

【HDU - 1455】Sticks (dfs + 剪枝)

题干&#xff1a; George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were original…

java找不到符号类socket,编译报错+解决方法:错误: 找不到符号

public class ServerPlainTest { // 包内包外可见public static void main(String[] args) {try {ServerSocket ss new ServerSocket(8189);System.out.println("the server has startuped, waiting for connections.");while (true) { // accept multiple clients …

php hbase thrift,PHP使用Thrift操作Hbase

系统架构图HBase 启动 Thrift服务hbase启动thrift服务// 进入安装的hbase bin目录下// 执行hbase-daemon.sh start thrift2需要注意的是&#xff0c;这里启动的是thrift2服务&#xff0c;如果需要启动thrift服务只需要将thrift2改为thrift就可以了&#xff0c;具体thrift和thri…

【CodeForces - 761D 】Dasha and Very Difficult Problem (构造,思维)

题干&#xff1a; Dasha logged into the system and began to solve problems. One of them is as follows: Given two sequences a and b of length n each you need to write a sequence c of length n, the i-th element of which is calculated as follows: ci  bi -…

php excel下载打不开了,php下载excel无法打开的解决方法

php下载excel文件,1、在下载的过程中不要 输出任何非文件信息&#xff0c;比如 echo log信息。 否则下载后的文件无法打开&#xff0c;提示格式错误或者文件被破坏。2、 输出的excel格式一定要和后缀名保存一直&#xff0c;否也会提示格式错误或者文件被破坏if (file_exists(CA…

【CodeForces - 761B】Dasha and friends (思维,模拟,构造)

题干&#xff1a; Running with barriers on the circle track is very popular in the country where Dasha lives, so no wonder that on her way to classes she saw the following situation: The track is the circle with length L, in distinct points of which there…

php字符串变量,PHP 字符串变量

PHP 字符串变量字符串变量用于存储并处理文本。PHP 中的字符串变量字符串变量用于包含有字符的值。在创建字符串之后&#xff0c;我们就可以对它进行操作了。您可以直接在函数中使用字符串&#xff0c;或者把它存储在变量中。在下面的实例中&#xff0c;我们创建一个名为 txt 的…

【CodeForces - 761C】Dasha and Password (暴力可过,标解dp,字符串,有坑总结)

题干&#xff1a; After overcoming the stairs Dasha came to classes. She needed to write a password to begin her classes. The password is a string of length n which satisfies the following requirements: There is at least one digit in the string,There is a…

php4和php5的区别,什么是PHP 4和PHP 5之间的区别是什么-php是什么文件

&#xff1f;尽管PHP 5是故意设计成兼容尽可能与以前的版本&#xff0c;也有一些显著的变化。 其中的一些变化包括&#xff1a; 一个新的OOP模型基础上&#xff0c;Zend引擎2.0 改进MySQL支持的一个新推广 内置SQLite的原生支持 一个新的错误报告不断&#xff0c; E_STRICT &am…

【HDU - 2717】【POJ - 3278】Catch That Cow (经典bfs,类似dp)

题干&#xff1a; Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farme…

php 向公众号发送消息,微信公众号之主动给用户发送消息功能

前一段时间项目中遇到一个稍微麻烦一点的问题。即客户要求&#xff0c;他在后台编辑好文章后要主动给每个用户都发送消息&#xff0c;并可以让用户点击直接进入文章页面。于是乎&#xff0c;当时脑子一热&#xff0c;想着没什么大的问题&#xff0c;so easy。模板消息不就得了。…