随笔分类 -  组合数学

Catalan数
摘要:Catalan(n)=c(2*n,n)/(n+1) (n=0,1,2,3....)常见处理的问题:1.括号化问题。 矩阵链乘: P=a0×a1×a2×a3×……×an,共有(n+1)项,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(Catalan(n)种)二叉树个数:有N个节点的二叉树共有多少种情形?(Catalan(n)种)多边形三角剖分:2.出栈次序问题。 阅读全文

posted @ 2012-04-17 12:07 c语言源码 阅读(491) 评论(0) 推荐(0)

第二类斯特林数
摘要:s(m,n)表示把m个有区别的球放到n个相同的盒子中,且无一空盒,其不同的方案数。s(m,n)=ns(m-1,n)+s(m-1,n-1) (m>=n)s(m,n)=0 (m<n)s(0,0)=1;long long data[N][N]; void stirling(int m, int n) { int min, i, j; memset(data,0,sizeof(data)); data[0][0] = 1; for( i = 1; i <= m; ++i ){ if( i < n ) min = i; ... 阅读全文

posted @ 2012-04-17 11:23 c语言源码 阅读(446) 评论(0) 推荐(0)

生成函数/拆分数计算
摘要:计算整数n的拆分数用的是生成函数的方法。首先来看一下生成函数所解决的问题(1+x+...+x^n+...)(1+x+...+x^n+...)...(1+x+..+x^n+...) 这个母函数可以这样理解(转化为经典的 不可区分球 放 可区分盒 中的问题):每一个括号表示一个盒内放的球的情况在计算拆分数时需要用一个ferrers图像性质:n拆分成m个数的和的拆分数等于将n拆分成最大数不超过m的拆分数。(这里n,m的大小无关系)既然最大数不超过m,那么问题便转化为,有几个1,2...n.写成生成函数即为 (1+x+...+x^n+...)(1+x^2+x^4+x^8+...)...(1+x^n+x 阅读全文

posted @ 2012-04-17 10:58 c语言源码 阅读(260) 评论(0) 推荐(0)

组合数
摘要:n个球m个盒子是否空盒方案数无区别有区别无C(n-1,m-1)(隔板法)无区别有区别有C(n+m-1,n)(m-1个隔板,n个球共n+m+1个位置选n个位置)有区别无区别无S(n,m)有区别无区别有S(n,1)+S(n,2)+...+S(n,m) (n>m)S(n,1)+S(n,2)+...+S(n,n) (n<m)无区别无区别有将n拆分成最多m个数的和等于将n拆分成最大数不超过m的和(用生成函数做)无区别无区别无先每个盒子各放一个球,将n-m拆分成最多m个数的和等于将n拆分成最大数不超过m的和(用生成函数做)有区别有区别无m!*S(n,m)从{1,2,3....,n}中选r个两两 阅读全文

posted @ 2012-04-17 00:09 c语言源码 阅读(609) 评论(0) 推荐(0)

母函数的应用 :HDU 1028/ HDU 1328 / HDU 1085
摘要:母函数的应用HDU 1028#include<stdio.h> #include<string> using namespace std; int n,c1[200],c2[200]; int main(){ int i,j,k; while(scanf("%d",&n)!=EOF){ memset(c2,0,sizeof(c2)); for(i=0;i<=n;i++) c1[i]=1; for(i=2;i<=n;i++){ for(j=0;j<=n;j++) for(k=0;k+j<=n;k+=i) c2[k+j]+ 阅读全文

posted @ 2012-04-01 10:58 c语言源码 阅读(240) 评论(0) 推荐(0)

XMU 1255
摘要:http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1255整数划分问题 996ms险过..(递归法)#include<cstdio> #include<string> #include<map> using namespace std; int n,mod; long long dps[500][500]; long long dp(int n,int m){ //n表示要拆分的整数,m表示拆成的数最大是几/拆成m个数的和 if(n<=1 || m==1)return 1; if(n<m)retur 阅读全文

posted @ 2012-03-31 21:26 c语言源码 阅读(265) 评论(0) 推荐(0)

生成排列和组合
摘要:1 . 无重复元素的全排列当然stl有next_permutation()函数,用起来更方便#include<cstdio> #include<string> using namespace std; int n,a[100],count; void permutation(int k){ if(k==n){ for(int i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); count++; return; } for(int i=k;i<=n;i++){ int tem= 阅读全文

posted @ 2012-03-30 19:21 c语言源码 阅读(385) 评论(0) 推荐(0)

Codeforces Round #104 (Div. 2) E - Lucky Subsequence
摘要:这个题其实就是个dp(类似背包),但是一些细节还是让我做了一晚上。这个题学习了组合数取模(逆元法)补充知识:逆元的求法(a/b) mod p=a*(b逆) mod pb*x=1(mod p) x就是b的逆元而b逆可以利用扩展欧几里德或欧拉函数求得:1).扩展欧几里德:b*x+p*y=1 有解,x就是所求2).欧拉函数:b^(p-1)=1(mod p),故b*b^(p-2)=1(mod p),所以x=b^(p-2)#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm 阅读全文

posted @ 2012-01-25 00:37 c语言源码 阅读(274) 评论(0) 推荐(0)

导航