逆元相关

来源:互联网 发布:旅游数据分析报告 编辑:程序博客网 时间:2024/05/29 14:27

取模:
(a+b)%p = (a%p + b%p)%p
(a-b)%p = (a%p - b%p + p)%p
(a*b)%p = (a%p*b%p)%p
(a/b) %p = ?
逆元
这里写图片描述

这里写图片描述

这里写图片描述

逆元–>倒数(相乘=1)

这里写图片描述

1、
这里写图片描述

顺便在p为质数的时候,直接求a^(p-2)就ok

这里写图片描述

2、扩欧,先来说一下扩展欧几里得算法:
求解形如ax+by=gcd(a,b)的一组解
求法:
这里写图片描述
求逆元:
这里写图片描述

3、线性求逆元

这里写图片描述

这里板子题
欧拉定理:(记得longlong)

#include <cstdio>#define LL long longusing namespace std;LL a,b;LL phi(LL n){    int ans=1;    for (int i=2;i*i<=n;i++)      if (n%i==0)      {        ans*=i-1; n/=i;        while(n%i==0) ans*=i,n/=i;      }    if (n>1) ans*=n-1;    return ans;}LL ksm(LL a,LL k){    LL ans=1;a%=b;    for (;k;k>>=1,a=a*a%b)      if (k&1) ans=ans%b*a%b;    return ans%b;}int main(){    scanf("%lld%lld",&a,&b);    LL hh=phi(b)-1;    printf("%lld",ksm(a,hh));} 

扩欧:

#include <cstdio> using namespace std;void exgcd(int a,int b,int &x,int &y){    if (b==0)    {        x=1; y=0; return;    }    exgcd(b,a%b,y,x);    y-=a/b*x;}int main(){    int x,y,a,b;    scanf("%d%d",&a,&b);    exgcd(a,b,x,y);    printf("%d",(x+b)%b);}

线性求逆元Emmm….因为是线性的,所以对于这道板子来说数组并不能开下。

int inv[N];void INV(int n,int p){    inv[0]=0;    inv[1]=1;    for (int i=2;i<=n;i++)        inv[i]=(p-(p/i))*inv[p%i]%p;}
原创粉丝点击