解模逆元? x

逆元:

丢线

对于正整数,如果有,那么把这个同余方程中的最小正整数解叫做的逆元。

逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为

推导过程如下

求现在来看一个逆元最常见问题,求如下表达式的值(已知)(|为整除号)

当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理!!!

但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求互素。实际上我们还有一种通用的求逆元方法,适合所有情况。

公式如下:

现在我们来证明它,已知,证明步骤如下

而对于(a/b)%m== 一个数

  1.当m是素数的时候,根据费马小定理(不懂的可以去这儿看看),直接输出b^(n-2)即可

  2.否则,就根据扩展欧几里得exgcd(b,m,x,y)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
int a,b,m;
int x,y;

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int r=exgcd(b,a%b,x,y),tmp;
    tmp=x,x=y;
    y=tmp-a/b*y;
    return r;
}

int fastpow(int a,int p)
{
    int bb=a;int ans=1;
    while(p!=0)
    {
        if(p%2==1)ans=ans*bb;
        bb=bb*bb;
        p=p/2;
    }
    return ans;
}

int main()
{
    scanf("%d%d%d",&a,&b,&m);
    for(int i=1;i<=sqrt(m);i++)
    {
        if(m%i==0)
        {
            int ans=exgcd(b,m,x,y);
            printf("%d",(a*ans)%m);
            return 0;
        }
    }
    printf("%d",fastpow(b,m-2));
}
时间: 2024-11-03 20:44:51

解模逆元? x的相关文章

同余问题,乘法模逆元【模板】

扩展欧几里得,求一组解x,y,使得gcd(a,b)  = d = a * x + b * y void ExGcd(int a,int b,int &d,int &x,int &y) { if(b == 0) { x = 1; y = 0; d = a; } else { ExGcd(b,a%b,d,y,x); y -= x*(a/b); } } 扩展欧几里得,求所有解x,y,使得c = a * x + b * y bool ModeEqual(int a,int b,int c)

codeforces 487C Prefix Product Sequence (模逆元+构造)

转自http://blog.csdn.net/houserabbit/article/details/41513745 题解写的真棒.. 题目链接:http://codeforces.com/problemset/problem/487/C 题目大意:构造一个1~n的排列  使得n个前缀积对n取余是一个0~n-1的排列 题目分析:好题,首先我们通过简单的分析可以得到n肯定是最后一个数,因为如果n在前面,前缀积肯定不止1个是n的倍数,也就是说对n取模至少有两个0,显然不满足排列,也就是说取模得到排

解模线性方程组 非互质中国剩余定理

首先咱们得感谢KIDx大神给出这样的解法. 这里是我所学习这个算法的地方:http://972169909-qq-com.iteye.com/blog/1266328 . 我将对这个算法进行一定的总结与梳理,以及小地方的修正. 今有物不知其数,三三数之余二:五五数之余三:七七数之余二.问物几何? 这是经典的孙子定理.我们注意到其中的模数都是互质的,这样可以让我们进行传统孙子定理中的转化与合并. 但是如果遇到不是互质的模线性方程组我们要怎么办呢? [主要使用手段:合并方程] 利用一定手段,不断的合

第一次用gurobi建模解模有感

使用python语言,这种语言具有强大的可读性,自己写程序的时候也要记得把必要的注释写在程序中- 其实最重要的还是公式的推敲和建立,python语言只是一个翻译公式的过程. 执行方法是:用cmd打开DOS界面找到.py的位置,输入“gurobi.bat  文件名.py”,如果有错误,会有相应的提醒,根据提醒修改错误即可. 一些使用DOS界面常用的指令需要熟记于心: 向上的箭头可以复制前一步的指令: cd   c:/是转到这个目录下: dir是当前目录: 第一次用gurobi建模解模有感

poj 2947 Widget Factory (高斯消元,解模线性方程)

链接:poj 2947 题意:生产一些零件,已知零件种数,记录条数 记录只记录了某次生产从周几开始,周几结束,以及生产了哪些产品. 每件商品生产所需天数为3-9天. 求每样产品需要多少天才能完成. 若无解输出Inconsistent data. 有无穷解输出Multiple solutions. 有唯一解,输出其解 分析:根据题目所给信息,可以列出同余方程组,再根据高斯消元求解, 但还得判断是无解,无穷解,还是唯一解 1.系数矩阵的秩若与增广矩阵的秩不相等,则无解,否则有解 2.若有解,若增广矩

POJ 2065 SETI(高斯消元解模方程组)

题目: SETI Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1693   Accepted: 1054 Description For some years, quite a lot of work has been put into listening to electromagnetic radio signals received from space, in order to understand what

HDU 5698 大组合数取模(逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1215    Accepted Submission(s): 600 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

poj 2115 C Looooops (解模线性方程)

链接:poj 2115 题意:对于C语言的循环语句for(i=A ; i!=B ;i +=C), 问在k位存储系统中循环几次才会结束. 若在有限次内结束,则输出循环次数,否则输出死循环. 注:利用了 k位存储系统的数据特性进行循环(会溢出) 例如int型是16位的,那么int能保存2^16个数据, 即最大数为65535(本题默认为无符号), 当循环使得i超过65535时,则i会返回0重新开始计数 如i=65534,当i+=3时,i=1   即 i=(65534+3)%(2^16)=1 分析:设对

poj 2891 Strange Way to Express Integers (解模线性方程组)

链接:poj 2891 题意:有一个数x,给定k组ai和ri,使得x%ai=ri 求x最小为多少 分析:求解模线性方程组 x = a1(mod m1) x = a2(mod m2) x = a3(mod m3) 先求解方程组前两项. x=m1*k1+a1=m2*k2+a2 -> m1*k1+m2*(-k2)=a2-a1 这个方程可以通过欧几里得求解出最小正整数的k1 则x=m1*k1+a1 显然x为两个方程的最小正整数解. 则这两个方程的通解为 X=x+k*LCM(m1,m2) -> X=x(