乘法逆元

前置芝士:

  • 同余

普通逆元

逆元是模意义下的除法。

就是求解同余方程 ax1(modm)

exgcd 求解即可。

Code:

#include<iostream>
#include<cstdio>
using namespace std;
void exgcd(int a,int b,int& x,int& y)  //拓展欧几里得
{
    if (!b){x=1;y=0;return ;}
    exgcd(b,a%b);
    int tmp=x;x=y;y=tmp-a/b*y;
}
int main()
{
    int a,b,x,y;
    scanf("%d %d",&a,&b);
    exgcd(a,b,x,y);
    printf("%d",(x+b)%b);//转 正
    return 0;
}

素数的逆元

我们知道素数是有费马小定理的:

p 为素数,则 xpx(modp)

当且仅当 xp 时:xp11(modp)

然后我们用后面的式子同除以一个 x,可以得到 x1xp2(modp),所以我们只要求出 xp2modp 就可以了,用快速幂求解即可。

Code:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll qpow(ll x,ll y,ll mod)  //快速幂
{
    ll ans=1,base=x;
    while (y)
    {
        if (y&1) ans*=base;
        base*=base;y>>=1;
    }
    return ans;
}
int main()
{
	ll x,p;
	scanf("%lld %lld",&x,&p);
	printf("%lld",qpow(x,p-2,p));
	return 0;
}

线性筛逆元

让人感受线性筛的奥妙

线性筛肯定是 O(n) 的嘛。

首先我们设 p=ki+r,然后可以知道 ki+r0(modp)(因为 ki+r=p,所以 pmodp=0)。

然后我们两边同乘 r1i1,就得到 kr1+i10(modp),移项得到 i1kr1(modp)

我们可以知道 k=pi,r=pmodi,所以我们得到公式:

i1pi×pmodi1(modp)

#include<iostream>
#include<cstdio>
using namespace std;
const int N=10001;
typedef long long ll;
ll inv[N];
void GetInv(ll n,ll p)
{
	for (int i=2;i<=n;i++)
		inv[i]=(-(p/i)*inv[p%i]%p+p)%p;
}

线性筛阶乘逆元

也就是线性筛 n!1

我们设 invi 表示 i! 的逆元。

我们可以轻易知道 invi+1=(1i+1)!1,我们同乘 i+1 就变成了,invi+1(i+1)=(1i!)1=invi,所以我们可以得到:

invi+1(i+1)=invi

所以我们先求出 n! 的逆元,再倒推回来即可。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll inv[3000100]; 
void GetFactInv()
{
	inv[1]=inv[0]=1;
   	for (int i=1;i<=n;i++)  //求阶乘
   		inv[i]=(inv[i-1]*i)%p;
   	inv[n]=GetInv(inv[n],p); //求n!的逆元
   	for (int i=n-1;i>=1;i--)//倒推 
   		inv[i]=(inv[i+1]*(i+1))%p;
   return 0;
}
posted @   yspm  阅读(143)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示