首页 > 其他分享 >逆元

逆元

时间:2024-08-10 09:49:20浏览次数:11  
标签:return int ll 逆元 inv mod

逆元用于求 $ \frac{a}{b} (mod\ p)$ 的结果

第一种方法:拓展欧几里得

  • 利用拓欧求解同余方程:\(a*x ≡ c\ (mod\ b)\) 的 \(c = 1\) 的情况
  • 就可以转化成求解 \(a*x+b*y=1\) 这个方程
void exgcd(ll a,ll b,ll &x,ll &y)  //解 ax + by = gcd(a,b) 的一组整数解 
{
	if(b==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	ll s_x=x;
	ll s_y=y;
	x=s_y;
	y=s_x-(a/b)*s_y;  //时间复杂度近似为logn 
}

//拓展欧几里得求逆元
ll inv1(ll a)
{
	ll x,y;
	exgcd(a,mod,x,y);
	return (x%mod+mod)%mod;
 }

第二种方法:快速幂

  • 这个做法要利用费马小定理

若\(p\)为素数, \(a\)为正整数,且\(a,p\)互质,则有\(a^{p - 1}≡1(mod\ p)\)。

  • 带入即可得到:$$x≡a^{p - 2}(mod\ p)$$
ll fastpow(ll a,ll b)  //快速幂(最多算到2^62) 
{
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%mod;  //取模运算 
		a*=a;
		b>>=1;
	}
	return res;
}

//2.费马小定理求逆元
ll inv2(ll a)
{
	return fastpow(a,mod-2);
 } 

第三种方法:线性算法

  • 用于求一连串数字对于一个 \(mod\ p\) 的逆元。
inv[1] = 1;
for(int i = 2; i < p; i ++)
    inv[i] = (p - p / i) * inv[p % i] % p;

一个用于第三种方法的例题:
P3811 【模板】模意义下的乘法逆元

点击查看代码
#include<cstdio>
#define ll long long
using namespace std;
const int maxn = 3e6 + 5;
ll inv[maxn];
int main(){
    inv[0] = 0, inv[1] = 1;
    int n, p;
    scanf("%d %d", &n, &p);
    printf("1\n");
    for(int i = 2; i <= n; i ++)
        inv[i] = ((ll)p - (p / i)) * inv[p % i] % p, printf("%lld\n", inv[i]);
    return 0;
}

标签:return,int,ll,逆元,inv,mod
From: https://www.cnblogs.com/yishujia/p/18351966

相关文章

  • 快速计算多个树的逆元
    设\(n\)个数分别为\(a_1\dotsa_n\),令\(s_i\)为\(a_i\)的前缀积,那么对于\(1\lei<n\)有\(s_i^{-1}=s_{i+1}^{-1}*a_{i+1}\),那么\(a_i^{-1}=s_i^{-1}*s_{i-1}\),可以\(\Theta(n+\logp)\)的求出\(n\)个数的逆元例题:LOJ161乘法逆元2#include<cstdio>typedeflonglongll;c......
  • P3811 【模板】模意义下的乘法逆元 题解
    【模板】模意义下的乘法逆元题目背景这是一道模板题题目描述给定n,pn,pn,p求......
  • 基础数论 模运算与逆元
    模运算与逆元:取模定义:\[a\bmodn\begin{cases}a-\lfloor\frac{a}{n}\rfloor\timesn\\\\\a\geq0\\-(-a\bmodn)\\\a<0\end{cases}\]取模基本性质:设\(a_0=a\bmodn,b_0=b\bmodn\)\((a+b)\bmodn=((a\bmodn)+(b\bmodn))\bmodn\)......
  • 乘法逆元
    定义如果一个线性同余方程\(ax\equiv1\pmodb\),则\(x\)称为\(a\bmodb\)的逆元,记作\(a^{-1}。\)前置知识$ax\equiv1\pmodb$,$\equiv$表示`(a*x)%b==1%b`求法:扩展欧几里得法voidexgcd(inta,intb,int&x,int&y){if(b==0){x=1......
  • 牛客周赛 Round50 E-小红的树上移动 (期望dp+逆元)
    E-小红的树上移动题目:题意:在一个树上从根节点移动,每次都会向更深的下一层走,如果此时已经是叶子节点没有下一层就会停留在这里。求出移动次数的期望,移动次数就是从根节点1开始到此节点的深度。思路:画一个草图不难看出其实在同一层中,到达每个点的概率是一样的。并且,对于每一层......
  • Atcoder357 D(逆元和快速幂)
    Atcoder357DD题意就是求给定一个数n的连续n个n相拼接,求最后的数\(mod998244353\)的值。我们假设n的长度为len,那么n个n相拼接可以看成n*(\(10^{len^0}\)+\(10^{len^1}\)+....+\(10^{len^{n-1}}\))。那个就可以利用高中等比数列的知识求出公式(\(n*(10^{len^n}-1\))/(\(10^{len}......
  • 乘法逆元
    对于1~n所有数字的lcm,应该是1~n中所有质数P的以P为底数对于n的对数次幂的乘积即lcm= ∏plogpn  。码题集OJ-跑步(matiji.net)线性筛 +乘法逆元由题意,1~n每个人最后都重新一起在终点相遇时间停止,那么终止时间则为1~n的所有lcm,根据上面方法,得到结束的t后,我们再......
  • 费马小定理 逆元 期望dp
    p8774include<bits/stdc++.h>usingnamespacestd;defineintlonglongdefinef(i,a,b)for(inti=(a);i<=(b);i++)definecl(i,n)i.clear(),i.resize(n);defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;type......
  • P3811 【模板】模意义下的乘法逆元
    题目:P3811【模板】模意义下的乘法逆元【模板】模意义下的乘法逆元题目背景这是一道模板题题目描述给定$n,p$求$1\simn$中所有整数在模$p$意义下的乘法逆元。这里$a$模$p$的乘法逆元定义为$ax\equiv1\pmodp$的解。输入格式一行两个正整数$n,p$。输出格式......
  • [题解]P5431 【模板】模意义下的乘法逆元 2
    可恶,卡常好难受。P5431【模板】模意义下的乘法逆元2将分数通分,第\(i\)个分数是\(\frac{k^i*fac\diva[i]}{fac}\),\(fac\)表示所有元素的积。我们可以用\(lr,rl\)记录\(a\)的前缀后缀积,第\(i\)个分数就是\(\frac{k^i*lr[i-1]*rl[i+1]}{lr[n]}\)。这样分母都是\(lr[n]\),分子就......