逆元基本知识

逆元的用处,ans = (a/b) % mod;

但是ans != (a%mod) / (b %mod)

因此我们 可以把ans 转化为 ans = a * inv(b,mod) % mod

inv(b,mod) 的含义为  b 对于 mod 的逆元 令 inv(b,mod) = x;

转化为同余方程就是 bx ≡ 1(% mod)

当 b 与 mod 互质的时候有两种方法求 inv(b,mod)

单个元素逆元

扩展欧几里得

  解不定方程 bx + mody = 1 其中 x的值即为 inv(b,mod)

  学习一个 http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

 1 int exgcd(int a,int b,int &x,int &y)
 2 {
 3     if(b==0)
 4     {
 5         x=1;
 6         y=0;
 7         return a;
 8     }
 9     int r=exgcd(b,a%b,x,y);
10     int t=x;
11     x=y;
12     y=t-a/b*y;
13     return r;
14 }

扩展欧几里得代码

费马小定理 百度百科 费马小定理

             

  所以有inv(b,mod) = pow(b,p-1)

但是当遇到b与mod不互质的情况我们有 ans = a % (mod*b) *b

转载自 :AC-dreamer逆元详解

1-n的逆元

  设 t1 = mod / i ; t2 = mod % i;

  所以我们有 t1 * i + t2 = mod

  即 (t1 * i + t2)  ≡ 0(% mod)

  移项 - t1 * i ≡ t2(% mod)

  同除 i*t2 有 -t1 * inv[t2] ≡ inv[i] & mod

代入有 inv[i] =  kmod - mod/i * inv[mod % i] % mod ; k 为正整数 且inv[i] > 0

  为了保证正负 不妨直接写 inv[i] =  (mod - mod/i) * inv[mod % i] % mod ;

应用:组合数逆元 

  预处理阶乘以及阶乘逆元  转自 : http://www.cnblogs.com/linyujun/p/5199684.html

 1 const int N = 200000 + 5;
 2 const int MOD = (int)1e9 + 7;
 3 int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
 4 void init(){
 5     inv[1] = 1;
 6     for(int i = 2; i < N; i ++){
 7         inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
 8     }
 9     F[0] = Finv[0] = 1;
10     for(int i = 1; i < N; i ++){
11         F[i] = F[i-1] * 1ll * i % MOD;
12         Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD;
13     }
14 }

预处理

1 int C(int n, int m){
2     if(m < 0 || m > n) return 0;
3     return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
4 }

公式求组合数

扩展:卢卡斯定理

C(n, m) % p  =  C(n / p, m / p) * C(n%p, m%p) % p

1 LL Lucas(LL n, LL m, int p){
2         return m ? Lucas(n/p, m/p, p) * C(n%p, m%p, p) % p : 1;
3 }

lucas

时间: 2024-12-14 18:46:57

逆元基本知识的相关文章

HDU 5685 Problem A | 快速幂+逆元

Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 463    Accepted Submission(s): 162 Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的

HDU 5651 逆元

xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 809    Accepted Submission(s): 231 Problem Description As we all known, xiaoxin is a brilliant coder. He knew **palindromi

关于乘法逆元的世界

引子 经过几天的努力,终于将逆元这个大难题给攻克了--心情激动的一时无法平复.下面就简单介绍一下关于逆元的知识,来记录自己的成果,也希望能够帮助到别人.某些地方可能理解的不够深入,还请多多包涵. 定义 逆元,又称数论倒数,如果a*x≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x.(来自维基百科) 怎么说呢,逆元其实就是一个相当于倒数的东西,只不过是多模了一个p而已.要说它有什么用,那么请回忆一下倒数有什么用吧.没错,在上小学时,老师就教导过我们,除以一个

常州培训 day3 解题报告

第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多能打掉多少点. N<=10000,其他<=10^18; 解题过程: 1.一开始就直接想到是贪心,首先人是不可能往左走的,否则不会最优.枚举最后停在哪个点,减去到这个点需要的体力,然后把这个点之前的所有点(包括这个店)的权值排个序,从小到大一个一个打,打到体力没有为止.复杂度分析:枚举N次,每次快拍

HDU 1014 Uniform Generator 题解

找到规律之后本题就是水题了,不过找规律也不太容易的,证明这个规律成立更加不容易. 本题就是求step和mod如果GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choice 为什么这个结论成立呢? 因为当GCD(step, mod) == 1的时候,那么第一次得到序列:x0, x0 + step, x0 + step-- 那么mod之后,必然下一次重复出现比x0大的数必然是x0+1,为什么呢? 因为(x0 + n*step) % mod: 且不需要考虑x0 % mod的值为

HDU5780 gcd 欧拉函数

http://acm.hdu.edu.cn/showproblem.php?pid=5780 BC #85 1005 思路: 首先原式化简:x?^gcd(a,b)??−1 也就是求n内,(公约数是i的对数)*x^i-1的和,其中i为n内的两两最大公约数.那么问题可以转化成先预处理出i,再求和,注意O(n*300)=1,正常情况会卡常数.必须还要优化 由于 ans=∑s[d]∗(x^?d??−1),记s[d]=最大公约数为d的对数 我们注意到求s[d] or (公约数是i的对数),也就是求n/i以

简单数论总结2——同余方程与扩展欧几里得算法

在上一次总结过后鸽了没多久其实是快要开学赶紧来肝上两篇 今日内容--同余方程和扩展欧几里得算法 同余 同余的定义:若存在两个整数a,b,使得(a - b) MOD P为0,则称作a与b在MOD P的情况下同余 换种通俗的说法,就是,a MOD P与b MOD P相等 记作  \( a\equiv b (mod P) \) 对于整数a,b,c和自然数m,n 同余具有以下性质: 自反性:\( a\equiv a (mod P) \) 对称性:若存在\( a\equiv b (mod P) \) ,则

求逆元的相关知识

定义:满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元. (1)为什么要有乘法逆元呢? 答:当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元. (2)如何求逆元? 答:我们可以通过求b关于p的乘法逆元k,将a乘上k再模p( 即(a*k)%p,这样比较好算 ).其结果与 (a/b) % p 等价. (3)如何证明? 证明: 根据b*k≡1 (mod p)有b*k=p*x+1,那么k=(p*x+1)/b. 把k代入(a*k) mod p,得:

CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+快速幂)

C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vitaly is a very weird man. He's got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal