noip复习之数学(2)——递推关系

1.问题一:兔子的繁殖(斐波拉契数列)

? f[n]=f[n-1]+f[n-2]

\[
Fibonacci:f(n)=\frac{1}{\sqrt{5}}\left(\frac{1+\sqrt{5}}{2}\right)^n-\frac{1}{\sqrt{5}}\left(\frac{1-\sqrt{5}}{2}\right)^n
\]

问题二:凸三角形剖分/括号化问题/不同出栈次序数问题/二叉树个数问题(卡特兰数)

f[n]=f[2]f[n-1]+f[3]f[n-2]+...+f[n-1]f[2]=f[n-1](4*n-2)/(n+1)

\[
Catlan:f(n)=\frac{\left(2*n\right)!}{n!*\left(n+1\right)!}
\]

问题三:火柴。用n(1<=n<=2000)根火柴棍能组成多少个非负整数

分析:令c[x]表示数字x需要的火柴数(0<=x<=9),用f[i]来更新f[i+c[x]](相当于在这个数的后面加上x这个数),当i等于0的时候不允许使用数字0,而是当n>=6时,给答案单独加上1,代表整数0。

d[i+c[x]]+=d[i];

问题四:立方数之和。

输入正整数n(n<=1e4),求将n写成若干个正整数的立方和有多少种方案。比如21有3种写法,77有22种写法,9999有440,022,018,293种写法

分析:建立多段图。设结点(i,j)表示“使用不超过i的大小的整数的立方,累加和为j”的这个状态,设d(i,j)为从(0,0)到(i,j)的路径条数,则最终的答案就是d(21,n)(因为21^3>n)
\[
d[i][j+a*i*i*i]+=d[i-1][j]
\]
但是还可以再优化:
\[
d[i][j]+=d[i][j-i*i*i](类似完全背包)
\]

问题五:村民排队。

村子里现在有n个人(1<=n<=40,000)个人,有多少种方式可以把他们排成一列,使得没有人站在他父亲的前面(有些人的父亲可能不在村子里面),输出总方案数模上1e9+7

问题六:带标号连通图计数。

统计有n(n<=50)个顶点的连通图有多少个。图的顶点有编号。

分析:在不考虑连通的情况的时候,这n个带标号的点共能构成
\[
h(n)=2^{\frac{n(n-1)}{2}}
\]
张图(若考虑任意两点之间都有边,则共有(n-1)+(n-2)+...+1=n(n-1)/2条边,而每条边都有连或者不连的选择,所以是2^(n(n-1)/2)种,我们设连通的图为f(n),未连通的图共有g(n)张,则f(n)+g(n)=h(n)。

g(n)可以这样计算:设1所在连通分量有k个点,就有C(n-1,k-1)种情况。确定点集后,1所在连通分量有f(n)种情况,而其他连通分量有h(n-k)种情况,则:
\[
g(n)=\sum_{k=1}^{n-1}C(n-1,k-1)*f(k)*h(n-k)
\]
每次计算出g(n)后,应立刻计算出f(n)和h(n)。

原文地址:https://www.cnblogs.com/iwillenter-top1/p/11616130.html

时间: 2024-10-09 00:02:41

noip复习之数学(2)——递推关系的相关文章

noip复习之数学(3)——数论

1.基本概念和常用代码 (1)素数(质数) int prime[maxn],tot=0; bool vis[maxn]; void init(int n) { vis[1]=1; for(int i=2;i<=n;++i) { if(!vis[i]) prime[++tot]=i; for(int j=1;j<=tot&&prime[j]*i<=n;++j) { vis[i*prime[j]]=1; if(i%prime[j]==0) break;//每个数都只会被它最小

noip复习之数学(4)——组合游戏

我们在此专题中将考虑这样一类组合游戏: (1)两个游戏者轮流操作 (2)游戏的状态集有限,并且不管双方怎么走,都不会再出现以前的状态.这保证了游戏在有限步内结束. (3)谁不能操作谁输,这样的规则避免了平局的出现. 而且我们只考虑公平游戏,即如果一个游戏者可以把状态A变为B,另一个游戏者也可以.国际象棋并不是公平游戏,因为白方可以移动白子,而黑方却不能移动白子. 状态图:为方便描述,我们可以把游戏中的状态画成图.每个节点是一个状态,每条边代表从一个状态转移到另一个状态的操作. 注意:先手必胜状态

【不定期更新】noip复习(或许有误请指正)

一.基本算法 2.二分查找 void find(int l,int r){ if (l>r || a[l]>x || a[r]<x) return; int mid = (l+r) >> 1; if (a[mid] == x){ if (mid < pos)pos=mid; if (a[mid-1] == x) find(l, mid-1); if (a[mid+1] == x) find(mid+1, r); return; } if (x > a[mid])

noip专题复习之数学(6)——置换及其应用

1.基本概念: 简单来说,置换就是把n个元素做一个全排列.比如1,2,3,4分别变成3,1,2,4,或者分别变成4,3,2,1.一般地,1变a1,2变a2,...的置换记为: \[ \left( \begin{matrix} 1 & 2\cdots & n\a_1 & a_2\cdots & a_n\\end{matrix} \right) \] 置换实际上就是一一映射, ? (1)可以用一个数组f={a1,a2,...,an}来表示1~n的一个置换,其中f[i]表示元素i

noip专题复习之数学(5)——概率与数学期望

1.全概率公式: 将样本分成若干个不相交的部分B1,B2,...,Bn,则P(A)=P(A|B1)P(B1)+P(A|B2) P(B2)+...+P(A|Bn)*P(Bn).(P(A|B)是指在B事件发生的条件下,事件A发生的概率. 使用全概率公式的关键是"划分样本空间",只有把所有可能不重不漏地进行分类,并算出每个分类下事件发生的概率,才能得出该事件发生的总概率. 2.数学期望: 简单地说,随机变量X的数学期望EX就是所有可能值按照概率加权的和. 比如一个随机变量有1/2的概率为1,

【NOIP复习】最短路总结

[模板] 1 /*堆优化Dijkstra*/ 2 3 void dijkstra() 4 { 5 priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > que;//定义大顶堆 6 for (int i=1;i<=n;i++) vis[i]=0,dis[i]=INF; 7 dis[1]=0; 8 que.push(make_pair&l

noip2017考前基础复习——数论数学

·最大公约数 gcd 辗转相除法  gcd(a,b)=gcd(b,a%b) 1 int gcd(int x,int y){ 2 if(y==0) return x; 3 return gcd(y,x%y); 4 } 效率O(logn) ·最小公倍数 lcm 可由最大公约数推来 lcm(a,b)=a*b/gcd(a,b) 1 int lcm(int x,int y){ 2 int p=gcd(x,y); 3 return a*b/p; 4 } 效率O(logn) ·扩展欧几里得 extgcd 求a

noip复习模板

我只会这么多 tarjan:codevs 1332 void tarjan(int u) { dfn[u]=low[u]=Time++; s.push(u); for(int i=head[u];~i;i=nxt[i]) { int v=to[i]; if(!dfn[v]) tarjan(v); else if(dfn[v]!=-1) low[u]=Min(low[u],low[v]); } if(dfn[u]==dfn[v]) { while(!s.empty()) { int x=s.top

[NOIP复习]第二章:动态规划

一.背包问题 1.Wikioi 1014 装箱问题 题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入描述 Input Description 一个整数v,表示箱子容量 一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积 输出描述 Output Description 一个整数,表示箱子剩余