上一页 1 ··· 46 47 48 49 50 51 52 53 54 ··· 182 下一页
摘要: 题意:给出n,p,问杨辉三角形的第n+1行有多少个数字能被p整除,p是素数。分析:杨辉三角形的第n+1行是由组合数c(n,k)组成的,k=0~n。因此,我们要求c(n,k)中有多少个p的倍数。首先我们求n!中含有多少个素因子p。数量为:n/p+n/(p^2)+……c(n,k)中含有素因子p的个数是,n!中的个数 - (n-k)!中的个数 - k!中的个数(结果为非负整数)我们要求有多少k使得c(n,k)不能被p整除,所以我们要c(n,k) 不包含素因子p,让上式为0,即:n/p+n/(p^2)+…… = (n-k)/p + (n-k)/(p^2) + ...... + k/p + k/(p^2 阅读全文
posted @ 2012-11-15 16:42 undefined2024 阅读(300) 评论(0) 推荐(0)
摘要: 题意:给出n,m,求n中取m个的排列数抛掉末尾的0后的最后一位。分析:题目可以转化为求一段连续数列的乘积的最后非0位。乘积的末尾之所以会有0,是因为数字中有包含2和5的倍数,2和5这两个质因子组成了0。我们先将所有2和5质因子去除,求其余数字乘积的最小位。我们将2的倍数全部取出,把每个数字除以2,这样就得到了一个小一些的连续数列,这样就转化为了一个子问题,用相同方法求其最小非0位即可,具体方法稍后讲。原连续数列中去除2的倍数的同时5的偶数倍也被去除了,还剩下所有的奇数,对于这个奇数数列我们将5的奇数倍(以5结尾的数字)取出,对于这些数字除以5之后得到了一个较小的连续奇数列,转化为了一个子问题。 阅读全文
posted @ 2012-11-14 14:08 undefined2024 阅读(559) 评论(0) 推荐(0)
摘要: 题意:一个矩阵,已知其中一些格会降落伞兵,每行每列都有一个武器,可以一次性消灭该行或该列的全部伞兵,每个武器对应不同的价格,若使用多个武器则总价是各个武器价钱的乘积,问消灭所有伞兵最少要多少钱。分析:最小权覆盖集。难点在于武器总价不是加和而是乘积,那么我们需要把各个单价转化为以e为底的对数,这样再求对数加和的时候其实各个原单价之间是相乘的关系。建立二分图,每行对应一个节点,每列对应一个节点,各点权值等于其武器价钱的以e为底的对数,每个伞兵是连接其所在行列节点的一条边。对这个二分图求最小权独立集。转化为最小割,转化为最大流。View Code #include <iostream># 阅读全文
posted @ 2012-11-09 14:13 undefined2024 阅读(847) 评论(0) 推荐(0)
摘要: 简单组合数学View Code #include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define maxn 10005struct Factor{ int value, num;} factor[maxn];bool is[maxn];int prm[maxn];int num;int n, m;int sum;int getprm(int n){ int i, j, k 阅读全文
posted @ 2012-11-05 14:46 undefined2024 阅读(200) 评论(0) 推荐(0)
摘要: 如果一个质数可以表示成4x+1的形式,那么它一定可以表示成两个数字的平方和。(2是特殊情况)用素数筛打素数,并用以上定理判断是否能表示成平方和,预处理好后,对于每个询问用O(1)时间输出。注意边界值可能为负数,负数中没有质数。View Code #include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define maxn 1000005bool is[maxn];int p 阅读全文
posted @ 2012-11-05 14:10 undefined2024 阅读(162) 评论(0) 推荐(0)
上一页 1 ··· 46 47 48 49 50 51 52 53 54 ··· 182 下一页