摘要: 组合数取余P不是素数,P是素数1)P是素数Lucastheoremm=mk*p^k+mk-1*p^k-1+...+m1*p+m0;n=nk*p^k+nk-1*p^k-1+...+n1*p+n0;C(m,n)=C(mk,nk)*C(mk-1,nk-1)*...*C(m1,n1)*C(m0,n0);【题目大意】求C(n+m,n)%p的值。保证p是素数。C(m,n)%p=m!/(n!*(m-n)!)%p此时使用逆元,或扩展欧几里德2)P是任意数时hdu 3037方法一:#include<stdio.h>#define LL long long#define nnum 100001int 阅读全文
posted @ 2011-08-20 13:51 qingyezhu 阅读(380) 评论(0) 推荐(0)
摘要: 来源于:http://www.cppblog.com/MiYu/archive/2010/08/25/124649.html以下是我从网上收集的关于组合博弈的资料汇总:有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取 阅读全文
posted @ 2011-08-19 16:55 qingyezhu 阅读(225) 评论(0) 推荐(0)
摘要: 利用P是素数所以有:(1). A/B%P=((A%(B*P))/B)%p;(2). A/B%P=A*(B`)%P 其中B`是B对于P的逆元方法一:#include<stdio.h>int main() { int i, t, x, v = 1, n, m, ans; long long P, a[51000], sum; scanf("%d", &t); while (t-- && scanf("%d", &n)) { a[0] = 1; sum = 0; P = 1000003; P *= n; for (i 阅读全文
posted @ 2011-08-19 14:09 qingyezhu 阅读(393) 评论(0) 推荐(0)
摘要: 分析:矩阵相乘O(n^3), 有k次,则复杂度为n^3*k。使用矩阵技巧,构造:B= | A A || O I |则B的乘方的结果其右上会是S,其他三个不变。此时化成了矩阵乘方问题,此时可以使用反复平方法,这样复杂度为(2n)^3*logk#include<stdio.h>#define nnum 61int res[nnum][nnum], te[nnum][nnum], n, m;void mulmatrix(int a[nnum][nnum], int b[nnum][nnum], int mark) { int i, j, k, temp[nnum][nnum]; for 阅读全文
posted @ 2011-08-15 18:16 qingyezhu 阅读(453) 评论(3) 推荐(1)
摘要: 转载于:http://220.181.111.15/%B7%E7%C0%D7%D1%B8%C1%D2/blog/item/bd38bb9e24790f116e068cd1.html1) int型变量循环左移k次,即a=a < <k |a>>16-k (设sizeof(int)=16)(2) int型变量a循环右移k次,即a=a>>k |a < <16-k (设sizeof(int)=16)(3)整数的平均值对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢 阅读全文
posted @ 2011-08-11 12:39 qingyezhu 阅读(258) 评论(0) 推荐(0)
摘要: 反素数问题描述:对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.现在给一个N,求出不超过N的最大的反素数.比如:输入1000 输出 840思维过程:求[1..N]中约数在大的反素数-->求约数最多的数如果求约数的个数 756=2^2*3^3*7^1(2+1)*(3+1)*(1+1)=24基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子为了剪枝:性质一:一个反素数的质因子必然是从2开始连续的质数.因为最多只需要10个素数构造: 阅读全文
posted @ 2011-08-05 21:13 qingyezhu 阅读(353) 评论(0) 推荐(0)
摘要: 原创帖!转载请注明作者 AekdyCoin !【普通Baby Step Giant Step】【问题模型】求解A^x = B (mod C) 中 0 <= x < C 的解,C 为素数【思路】我们可以做一个等价x = i * m + j ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C) )而这么分解的目的无非是为了转化为:(A^i)^m * A^j = B ( mod C)之后做少许暴力的工作就可以解决问题:(1) for i = 0 -> m, 插入Hash (i, A^i mod C)(2) 枚举 i ,对于 阅读全文
posted @ 2011-08-05 16:31 qingyezhu 阅读(296) 评论(0) 推荐(0)
摘要: 以下转自:http://hi.baidu.com/aekdycoin/blog/item/b317ca18bb24334942a9ad55.html【普通Baby Step Giant Step】【问题模型】求解A^x = B (mod C) 中 0 <= x < C 的解,C 为素数【思路】我们可以做一个等价x = i * m + j ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C) )而这么分解的目的无非是为了转化为:(A^i)^m * A^j = B ( mod C)之后做少许暴力的工作就可以解决问题:(1) f 阅读全文
posted @ 2011-08-04 15:32 qingyezhu 阅读(281) 评论(0) 推荐(0)
摘要: 测试数据中有负数。湖南师范大学(hunnu OJ)提交时要使用%I64d只要将n进行素因子分解,把所有素因子数目的gcd求出来就行。注意:n可能是负数,所以对于负数还需要将求出来的结果试除2,直到结果不是偶数才是最后负数的结果#include<stdio.h>#include<string.h>#include<math.h>#define nmax 65536int prime[nmax], plen, cfactor[nmax], clen;void init() { memset(prime, -1, sizeof(prime)); int i, j; 阅读全文
posted @ 2011-08-02 20:29 qingyezhu 阅读(276) 评论(0) 推荐(0)
摘要: 大数分解pollard-rho素数判定miller-rabin#include<stdio.h>#include<time.h>#include<stdlib.h>#define LL unsigned long long#define nmax 2005LL factor[nmax], num[nmax], minx, ans;int flen, nnum;LL modular_multi(LL a, LL b, LL c) { LL ret; ret = 0, a %= c; while (b) { if (b & 1) { ret += a; 阅读全文
posted @ 2011-08-01 16:06 qingyezhu 阅读(350) 评论(0) 推荐(0)