随笔分类 - 组合数
摘要:题目链接:http://acm.hrbeu.edu.cn/index.php?act=problem&id=1010&cid=25其中P为非素数,所以有:将C(n,m)%p=p0^C0```pi^Ci%p#include<stdio.h>#include<string.h>#define LL long long#define nmax 100001int flag[nmax], prime[nmax];int plen;void mkprime() { int i, j; memset(flag, -1, sizeof(flag)); for (i =
阅读全文
摘要:由于素数P很小,故先打阶乘的余数表(小于P的所有正数阶乘对P的余数表)。/* * soj3252.c * * Created on: 2011-10-10 * Author: bjfuwangzhu */#include<stdio.h>#define nmod 10007int num[nmod];void init() { int i; for (i = 1, num[0] = 1; i < nmod; i++) { num[i] = num[i - 1] * i % nmod; }}int modular_exp(int a, int b) {...
阅读全文
摘要:由于素数P比较小,所以可以先打表,求出小于P的数的阶乘对与该素数的余数,这样节省了中间求阶乘的时间。/* * soj3290.c * * Created on: 2011-10-10 * Author: bjfuwangzhu */#include<stdio.h>#define LL long long#define nmod 10009int num[nmod];void init() { int i; for (i = 1, num[0] = 1; i < nmod; i++) { num[i] = num[i - 1] * i % nmod; ...
阅读全文
摘要:1)根据一下公式,直接计算 C(n,m) mod p = n*``*(n-m+1)/(1*``*m) mod p 计算分别分子nn、分母mm中p的个数和对p的余数,若分子中p的个数多余分母中p的个数,则结果为0, 若不是,则原式变为nn/mm mod p (nn,p)=1,(mm,p)=1 此时如何求逆元变得至关重要,以下有两种解法。2)Lucas 定理:是用来求 C(n,m) mod p的值,p是素数。 描述为: Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p) Lucas(n,0,p)=1; 而 C(a,b)=a*(a-1)*```*(a-...
阅读全文
摘要:对于本题的因数m,只需要将其化素因子的乘积形式,之后只需要判定每一个素因子p在组合数中的个数是否大于或等于在因数m中的个数,若是则输出Yes,若存在某一个不是则输出No。至于如何判断一个素因子在组合数中的个数,如下所示://获得素因子p在1*2*··n中的个数int getNum(int n, int p) { int res; res = 0; while (n) { res += n / p; n /= p; } return res;}代码如下:#include<stdio.h>#include<string.h>#include...
阅读全文
摘要:对于本题的因数m,只需要将其化为素因子的乘积形式,其中每一个素因子的个数为mi,之后只需要求得每一个素因子pi在组合数中的个数Ci,然后将取Ci/mi中的最小的那个,就是该因数在组合数中的个数。代码如下:/* * fafu1079.c * * Created on: 2011-10-9 * Author: bjfuwangzhu */#include<stdio.h>#include<string.h>#include<math.h>#define nmax 31625int flag[nmax], prime[nmax], pfactor[nmax], c
阅读全文

浙公网安备 33010602011771号