知识点:逆元求组合数取模

目标:求出C(n,m)%p 这里p是一个素数!

方法:费马小定理求逆元

因为膜的性质并不对除法适用,比如(a/b)%c;

但是,当我们知道了b%c的逆元d时,问题可以转化为:(a*d)%c=((a%c)*(b%c))%c;

考虑费马小定理:

a^p-1=1(mod p)

显然有:

a*a^p-2=1(mod p)

那么a^p-2就是a膜p意义下的逆元

利用快速幂即可求出!

然后我们需要预处理出m!,(n-m)!,分别对他们求出逆元,再与n!乘并取模即可!

原文地址:https://www.cnblogs.com/little-cute-hjr/p/11787646.html

时间: 2024-10-12 21:08:42

知识点:逆元求组合数取模的相关文章

逆元求组合数

long long pow_mod(long long x, long long n, long long mod) { long long res = 1; while (n) { if (n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } long long fac[Max]; long long n, m, p; int main() { while (~scanf("%lld %l

组合数取模 Gym100947E || codeforces 559c

E - Qwerty78 Trip Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice Gym 100947E Description standard input/output Announcement Statements Qwerty78 is a well known programmer (He is a member of the ICP

hdoj 4828 卡特兰数取模

Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 93    Accepted Submission(s): 25 Problem Description 度度熊近期非常喜欢玩游戏.这一天他在纸上画了一个2行N列的长方形格子. 他想把1到2N这些数依次放进去.可是为了使格子看起来优美,他想找到使每行每列都递增的方案.只是画了

组合数取模终极版

以前讲述过很多组合数取模问题,详见:http://blog.csdn.net/acdreamers/article/details/8037918 今天,我们继续学习一些稍有难度的组合数取模问题,比如大组合数对合数取模,求大组合数的最后位数字等等. 首先来看组合数对合数取模问题 问题:求的值,其中和,并且是合数. 分析:先把素因子分解,然后转化为求,这里为素数,然后用CRT合并.所以现在重点来研究 如何求的值.这个问题AekdyCoin大神已经详细讲述了,如下链接     链接:http://h

逆元 - 组合数取模

现在目标是求$C_n^m\%p$,p为素数(经典p=1e9+7) 虽然有$C_n^m=\frac{n!}{m!(n-m)!}$,但由于取模的性质对于除法不适用,所以$C_n^m\%p$≠$( \frac{n!\%p}{m!\%p*(n-m)!\%p} )\%p$ 所以需要把"除法"转换成"乘法",才能借助取模的性质在不爆long long的情况下计算组合数.这时候就需要用到"逆元"! 逆元:对于a和p,若a*b%p≡1,则称b为a%p的逆元. 那

hdu 1452 Happy 2004 (快速幂+取模乘法逆元)

Problem Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).Take X = 1 for an example. The positive integer divisors of

通过逆元实现大数据除法的取模

当题目中数据较大,而且计算中出现过除法的时候.往往取模会出错 当计算 (A/B) % c    等价于  (A*B1)% c 其中 B1 是 B 的逆元. 那么逆元如何求呢. 先给出逆元的定义 a*x ≡1 (mod n)  ,如果x是方程的解,则x称作 a 关于模 n 的逆. a的逆元存在是有条件的: 方程ax-ny==1 要有解 则 1必须是gcd(a,n)的倍数 ,因此,a和n必须素质, 即 gcd(a,n)==1 在这个前提下 ax≡1(mod n) 只有唯一解. 现在我们来证明上面的结

HDU 5698 大组合数取模(逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1215    Accepted Submission(s): 600 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

为什么组合数取模要用逆元

首先说明一个事实,你直接算出来一个组合数的结果直接对p取模,结果一定是对的,那么这是对一个计算结果一次取模 (但上面的前提是你使用的数据结构能存储得下取模前的结果 但如果我们要通过一个前面取过模的式子递推出其他要取模的式子,而递推式里又存在除法 那么一个很尴尬的事情出现了,假如a[i-1]=100%31=7 a[i]=(a[i-1]/2)%31 a[i]=50%31=19 ,但我们现在只知道a[i-1]=7,如何计算出a[i]=19呢? a[i]=(7/2)%31=3? 其实本来是100是整除2