题意: 把K个不超过N的非负整数加起来,使它们的和为N,有多少种方法? 隔板法...不会的可以买一本高中数学知识清单...给高中班主任打个广告.... 隔板法分两种...一种是不存在空集 = C(n-1,m-1)...一种是存在空集 = C(n+m-1, m-1) 这题就是存在空集的解法...因为可以是0 .只会快速幂写组合数的我瑟瑟发抖...赶紧翻了紫书... #include <iostream> #include <cstdio> #include <sstream&g…
这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这里有N个相同的小球,要求放到k个相同的盒子中,盒子可以为空,但一定要把所有球都放进盒子中,问共有多少种放法.经过题目描述的转换,这道题目就可以运用隔板法的公式:所有符合条件的情况的种数为c[N+k-1][k-1]. 由组合数的公式可得c[m][n]=c[m-1][n-1]+c[m-1][n].由于这…
Larry is very bad at math — he usually uses a calculator, whichworked well throughout college. Unforunately, he is now struck ina deserted island with his good buddy Ryan after a snowboardingaccident.They’re now trying to spend some time figuring out…
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1884 题目大意: 把K个不超过N的非负整数加起来,使得他们的和为N,有多少种方法?比如N=5,K=2,有6种方法.即0+5,1+4,2+3,3+2,4+1,5+0. 输入N和K,求方法总数除以10^6的余数 思路: 递推,从(n-1,k)种的解+上1不就是答案了么?同理从(n,k-1)中加上…
将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ i },可以理解为前j-1个数之和为i-k,最后一个数为k 还有一种更快的递推办法,把这个问题转化为将N个小球放到K个盒子中的方法数,盒子可以为空. 就等价于求x1 + x2 +...+ xK = N的非负整数解的个数,根据组合数学的知识容易算出结果为C(N+K-1, K-1). 所以也可以这样递推…
设函数 f(k)(n); 则: f(1)(n)=1; f(2)(n)=f(1)(0)+f(1)(1)+f(1)(2)+...+f(1)(n); f(3)(n)=f(2)(0)+f(2)(1)+f(2)(2)+...+f(2)(n); . . . f(k)(n)=f(k-1)(0)+f(k-1)(1)+...+f(k-1)(n); 可预处理. 附代码: #include <iostream> #include <cstring> using namespace std; int ma…
题意:给出n,k,问恰好有k个不超过n的数的和为n的方案数有多少 可以隔板法来做 现在有n个小球放到k个盒子里面,盒子可以为空 那么就是n-k+1个缝隙,放上k-1个隔板(k-1个隔板就分成了k份) 所以总的方案数为 C(n+k-1,k-1) 所以可以转化为C(i,j)=C(i-1,j)+C(i,j-1) 即为d[i][j]=d[i-1][j]+d[i][j-1], d[i][j]表示j个数的和恰为i的方案数 #include<iostream> #include<cstdio>…
在纸上演算一下就能看出答案是:sum{ C(n-1, i) * a[i] / 2^(n-1) | 0 ≤ i ≤ n-1 } 组合数可以通过递推计算:C(n, k) = C(n, k-1) * (n-k-1) / k 但是n太大了,直接计算组合数会爆double的.所以计算的时候要取一下对数就行了,组合数对数的递推相应就变成了log_C(n, k) = log_C(n, k-1) + log(n-k-1) - log(k) #include <cstdio> #include <cmat…
C(n, k) = m, 固定k,枚举k 这里用到了组合数的一个性质 当k固定的时候,C(2 * k, k) 最小 C(m, k)最大(对于这道题而言是这样,因为大于m 就最终答案不可能为m了) 所以就二分去枚举2*k到m之间了. 最后注意算组合数的时候超过m可以直接返回,同时比较时候可能会超出long long 有小技巧可以避免,看代码. #include<cstdio> #include<vector> #include<algorithm> #define REP…
<训练之南>上的例题难度真心不小,勉强能看懂解析,其思路实在是意想不到. 题目虽然说得千奇百怪,但最终还是要转化成我们熟悉的东西. 经过书上的神分析,最终将所求变为: 共n个叶子,每个非叶节点至少有两个子节点的 树的个数f(n).最终输出2 × f(n) 首先可以枚举一下根节点的子树的叶子个数,对于有i个叶子的子树,共有f(i)种, 设d(i, j)表示每棵子树最多有i个叶节点,一共有j个叶节点的方案数. 所求答案为d(n-1, n) 假设恰好有i个叶子的子树有p棵,因为每个子树互相独立,所以…