14求逆元模板

kb2.4.1扩展欧几里德法

#include<iostream>
#include<stdio.h>
using namespace std;

//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y){
    if(a==0&&b==0)return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

//求逆元
//ax=1(mod n)
long long mod_reverse(long long a,long long n){
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    if(d==1)return (x%n+n)%n;
    else return -1;
}

int main(){
    long long a,n;
    scanf("%lld%lld",&a,&n);
    printf("%lld\n",mod_reverse(a,n));
    return 0;
}

kb2.4.1简洁写法

注意:这个只能求a<m的情况,而且必须保证a和m互质

#include<iostream>
#include<stdio.h>
using namespace std;

//求ax=1(mod m)的x值,就是逆元(0<a<m)
long long inv(long long a,long long m){
    if(a==1)return 1;
    return inv(m%a,m)*(m-m/a)%m;
}

int main(){
    long long a,m;
    scanf("%lld%lld",&a,&m);
    printf("%lld\n",inv(a,m));
    return 0;
}

kb2.4.3利用欧拉函数

mod为素数,而且a和m互质

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;

long long inv(long long a,long long mod){//为素数mod
    //return pow_m(a,mod-2,mod);
    return int(pow(a,mod-2))%mod;
}

int main(){
    long long a,mod;
    scanf("%lld%lld",&a,&mod);
    printf("%lld\n",inv(a,mod));
    return 0;
}

时间: 2024-10-09 22:14:31

14求逆元模板的相关文章

exgcd求逆元模板

求x在模为mod时的逆元: exgcd(x,mod,x,y) 求出后,第三个参数就是逆元. mod可以不为质数 template <class T> T exgcd(T a, T b, T &x, T &y) { if (!b) { x = 1, y = 0; return a; } T t, ret; ret = exgcd(b, a%b, x, y); t = x, x = y, y = t - a / b*y; return ret; } 版权声明:本文为博主原创文章,未

【learning】 多项式求逆元详解+模板

概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的逆元. 前置技能 快速数论变换(NTT),求一个数$x$在模$p$意义下的乘法逆元. 多项式的逆元 给定一个多项式$A$,其次数为$deg_A$,若存在一个多项式$B$,使其满足$deg_B≤deg_A$,且$A(x)\times B(x) \equiv 1 (mod x^n)$

codeforces 492E. Vanya and Field(exgcd求逆元)

题目链接:codeforces 492e vanya and field 留个扩展gcd求逆元的板子. 设i,j为每颗苹果树的位置,因为gcd(n,dx) = 1,gcd(n,dy) = 1,所以当走了n步后,x从0~n-1,y从0~n-1都访问过,但x,y不相同. 所以,x肯定要经过0点,所以我只需要求y点就可以了. i,j为每颗苹果树的位置,设在经过了a步后,i到达了0,j到达了M. 则有 1----------------------(i + b * dx) % n = 0 2------

HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法

地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 754    Accepted Submission(s): 279 Problem Description When ?? was born, seven crows flew

hdu_1576A/B(扩展欧几里得求逆元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4020    Accepted Submission(s): 3091 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

2016百度之星资格赛 Problem A(前缀积与求逆元)

题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973). 分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即可.但是每个前缀积都已经mod9973了,就不能直接这样得出结果了,所以利用求逆元.因为a/b(mod p)p是奇数的话,相当于a*inv(b) (mod p),所以只要保存每个位置的前缀积和前缀积的逆元就可以了. 但是题目有个坑点,如果x和y超出了这次字符串的位置,可以使用上一次数据储存的值而不是

hdu 1576 求逆元

题意:给出n=A mod 9973和B,求(A/B) mod 9973 昨天用扩展欧几里得做过这题,其实用逆元也可以做. 逆元的定义:例如a*b≡1 (mod m),则b就是a关于m的逆元. 求逆元方法也很简单,用扩展欧几里得解这个方程即可. 逆元性质:若a是b的逆元,则(x/a)mod p=(x*b)mod p 对于本题呢?设B的逆元为x, 那么有(A/B) mod 9973=((A mod 9973)*(x mod 9973))mod 9973 Reference:  http://blog

字符串_KMP算法(求next[]模板 hdu 1711)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 问题描述:给两个序列a,b,长度分别为n,m(1<=n<=1000000,1<=m<=10000),问序列b是否为序列a的子序列,若是:返回a中最左边的与b相等的子序列的首元素下标:若不是,输出-1. 目的:方便以后查看KMP算法中next[]的模板 Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory

暑期学习日记二—利用扩展欧几里得求逆元

最近学习了扩展欧几里得和乘法逆元的关系,在这里写一下巩固一下记忆 扩展欧几里得是什么呢,在这就不详解了,可以自行百度,主要来说,对于 求解ax ≡ 1(mod n)来说,当gcd(a,n)=1时,证明逆元存在,若不等于1,则证明逆元不存在. 那么当逆元存在时,我们要如何求它的逆元呢? 首先是扩展欧几里得定理,先将式子转换成 ax-ny = 1 的形式,然后我们要通过扩展欧几里得定律去获得它的最大公约数,还有它的一组解 X0,Y0 1 int exgcd(int a, int b, int &x,