OEIS 是一个记录数的组织 你可以在上面找到一组数是什么数
Permutation
P (n,r)/r;
母函数
实际上理解为
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<deque>
#include<stack>
#include<queue>
#include<algorithm>
#include<math.h>
#include<deque>
#define MAX 100000+5
using namespace std;
typedef long long LL;
int main()
{
LL n,i,j,k,a[305],ans[305];
while(~scanf("%lld",&n)&&n)
{
for(i=0;i<=n;i++)
{
a[i]=1;
ans[i]=0;
}
for(i=2;i<=n;i++)
{
for(j=0;j<=n;j++)
{
for(k=0;k+j<=n;k+=i*i)
{
ans[k+j]+=a[j];
}
}
for(j=0;j<=n;j++)
{
a[j]=ans[j];
ans[j]=0;
}
}
printf("%lld\n",a[n]);
}
return 0;
}
先升维后降维
滚动数组
唯一分解定理
容斥原理
抽屉原理 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。” 抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。
卡特兰数
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
所有的奇卡塔兰数Cn都满足n = 2^k − 1。
所有其他的卡塔兰数都是偶数。
应用
括号化
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种) [4]
出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
类似问题
一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
给定节点组成二叉搜索树
给定N个节点,能构成多少种不同的二叉搜索树?
(能构成h(N)个)
(这个公式的下标是从h(0)=1开始的)
n对括号正确匹配数目
#include<stdio.h>
int a[105][100];
void qwe1()
{
int i,j,add,len,t;
a[2][0]=1;
a[2][1]=2;
a[1][0]=1;
a[1][1]=1;
len=1;
for(i=3;i<101;i++)
{
add=0;
for(j=1;j<=len;j++)
{
t=(a[i-1][j])*(4*i-2)+add;
add=t/10;
a[i][j]=t%10;
}
while(add)
{
a[i][++len]=add%10;
add/=10;
}
for(j=len;j>=1;j--)
{
t=a[i][j]+add*10;
a[i][j]=t/(i+1);
add= t%(i+1);
}
while(!a[i][len])
{
len--;
}
a[i][0]=len;
}
}
int main()
{
qwe1();
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=a[n][0];i>0;i--)
{
printf("%d",a[n][i]);
}
printf("\n");
}
return 0;
}
第一类Stirling数 表示将 n 个不同元素构成m个圆排列的数目。
s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1
边界条件:s(p,0)=0 ,p>=1 s(p,p)=1 ,p>=0
第二类Stirling数其表示将n个不同的元素分成m个集合的方案数
S(p,k)的递推公式是:S(p,k)=k*S(p-1,k)+S(p-1,k-1) ,1<= k<=p-1
边界条件:S(p,p)=1 ,p>=0 S(p,0)=0 ,p>=1
斯特林公式
或更精确的
或
默慈金数是在数学中,一个给定的数n的默慈金数是“在一个圆上的n个点间,画出彼此不相交的弦的全部方法的总数”。1, 2, 4, 9, 21, 51, 127, 323, 835, 2188, 5798, 15511, 41835, 113634, 310572, 853467, 2356779, 6536382, 18199284, 50852019, 142547559, 400763223, 1129760415, 3192727797, 9043402501, 25669818476, 73007772802, 208023278209, 593742784829
贝尔数 在组合数学里,贝尔数给出了集合划分的数目,以数学家埃里克·坦普尔·贝尔(Eric Temple Bell)命名,是组合数学中的一组整数数列 以B0= B1=1为始, 首几项的贝尔数为:1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, …
那罗延数是组合数学问题中常用的一组计数序列。
那罗延数N(n,k)的计算公式为
那罗延三角中每一行的和为卡特兰数,即
卢卡斯定理 条件 <=1e5
欧拉函数