随笔分类 -  数学——组合数学

摘要:主要用来当求C(n,m)%p; 这里的n,m很大,不能用数组表示,而p可以用数组表示时。hdu: 3037Saving Beans题意:模型是有m + 1个球(0,1,2.....m),放到n个盒子里面,问有多少种方法。 典型的球同,盒不同,不允许空箱 C(n + m + 1 - 1,m + 1 - 1);思路:因为这里n,m太大,无法直接求,所以利用Lucas(n,m,p) = C(n%p,m%p)*Lucas(n/p,m/p,p)来求。View Code //#pragma comment(linker,"/STACK:327680000,327680000")#inc 阅读全文
posted @ 2013-04-30 11:47 E_star 阅读(279) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2604题意:L个人排队,这一队里男性用m表示,女性用f表示,问长度为L的序列里面不包含形如"fmf"和"fff"的可能的排队的数量:AC大牛的图:然后AC大牛给出了递推式:S0表示其他状态S1表示状态的后缀是(f),为了不和S2重复,姑且当成是(mf),其他状态同.其他的图上应该很明确了.现在就是状态转移显然在有后缀为fmf or fff以后后面无论加什么那么状态都不会变化了,于是假设dp[i][j]表示长为i,后缀状态为j的方案数dp[n][5]=2*dp[n-1][ 阅读全文
posted @ 2013-02-21 19:55 E_star 阅读(242) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4407比赛的时候想到了先求与p不互质的然后减去,但是就是遇到了容斥处理的问题,当时没有想到对因子容斥,只想到求和容斥那去了。。哎。悲剧啊、、题意:给出一个长度为n序列初始值为1,2,......n对其进行两种操作:"2 x c" 将x位置的值替换成y;"1 x y p" 求区间[x,y]内与p互质的数的和。思路:首先对于2操作我们离线处理,因为只有对于1,2,3.....n这样的序列我们在求1操作时才好处理,首先对p进行因式分解,可知他最多有6个因子因为到17是就已经大 阅读全文
posted @ 2012-09-23 10:35 E_star 阅读(288) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4291题意:...思路:首先暴力求出最外层模100000007的循环节MOD2,然后求出模MOD2的循环节MOD1.求出循环节后用类似与斐波那契数列举证优化的方法求解将时间复杂度由O(N)降到O(logN*2^3);ps:注意这里我们虽然求(n - 1)次幂就能得到{fn,fn-1}了,但是对于当n等于0时就要特殊判断,单纯的一个求幂判断完毕也就罢了,但是当多次求幂时,里面套着也会出现0也需要判断。比较麻烦您容易忽略。所以我们可以求到a^n次方去a.mat[0][1] = a.mat[1][0]。 当计算n- 阅读全文
posted @ 2012-09-19 19:17 E_star 阅读(242) 评论(0) 推荐(0) 编辑
摘要:容斥定理学习:http://www.cppblog.com/vici/archive/2011/09/05/155103.aspxhdu 1796How many integers can you findhttp://acm.hdu.edu.cn/showproblem.php?pid=1796题意:给定n和一个大小为m的集合,集合元素为非负整数。求1...n - 1内能被集合里任意一个数整除的数字个数。n<=2^31,m<=10思路:首先明白对于集合[1,n]内能被a整除的数的个数为n/a,既能被a整除又能被b整除的数的个数为n/lcm(a,b)(a,b的最小公倍数);容斥原理 阅读全文
posted @ 2012-08-24 20:43 E_star 阅读(432) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3252看了discuss里面的解题报告才明白的,这个解题报告太强大了:http://poj.org/showmessage?message_id=158333不多讲已经很详细了,不明白多看几遍肯定会明白的。注意这里的公式c(i,j) = c(i - 1,j -1) + c(i - 1,j);c(n,0) + c(n,1) + c(n,2) + c(n,3) + ...... + c(n,n) = 2^n;View Code #include <cstdio>#include <cstring>#include < 阅读全文
posted @ 2012-05-03 20:40 E_star 阅读(325) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1942将左右方向走看作1,上下方向看作0, 则结果就是c(n + m, m);这里第一印象做就是c(i,j) = c(i - 1,j - 1) + c(i - 1,j)这个递推公式,可是数据量太大不行。于是就用到了c(i,j) = c(i - 1, j - 1)*i/j这个公式了,(其实就是c(i,j) = (i*(i -1) * (i -2)....(i - j + 1))/(j*(j - 1).......*1))的计算只不过是怕先算分子分母再做除法时,分子分母的值会越界罢了。。两种实现方式:1:View Code #include & 阅读全文
posted @ 2012-05-03 18:54 E_star 阅读(234) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1019我自己也搞不清为什么分到组合数学里面去。一个找规律+递推的题目;才开始我也是理解错了题目以为求i位置下的数呢,题目要求的是第i个位置下的数字只能是0-----9了。WA了好几次才发现。首先根据((1 + x)*x)/2 =2147483647 估算到达65537肯定超过2147483647各数字。所以只要计算1到65537的各位数字即可。a[i]存第i行 1到i有多少个数字 sum[i]记录的是1 -- i 行总共有多少数字。首先根据sum确定i位置在那一行(按i分行,如下),然后在求在这一行的位置11 21 2 31 2 3 4.. 阅读全文
posted @ 2012-05-03 17:37 E_star 阅读(303) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1850以前接触组合数学的东西比较少,以后要训练一些这类的题目了。。http://baike.baidu.com/view/738955.htm利用的是公式是c[i][j] = c[i - 1][j - 1] + c[i][j - 1] 类比到杨辉三角。这道题目就是给字符串标号,给定的字符串要求满足s[i] < s[i + 1] < s[i + 2] ......,如果不满足则输出0,然后是给定一个字符串输出其编号。我们只要求出所有比他小的字符串的个数茫然后加上他本身就得到了他的编号。假设字符串为s,长度为len分两部分求:1:首 阅读全文
posted @ 2012-05-01 11:17 E_star 阅读(299) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示