定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b)

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

当d可以整除c时,一般方程ax+by=c的一组特解求法:

  1.求ax+by=d的特解x0,y0

  2.ax+by=c的特解为(c/d)x0,(c/d)y0

上述方程的通解:(c/d)x0+k(b/d) ,(c/d)y0-k(a/d)

乘法逆元有自然数倒数的类似性质

乘法逆元:b,m互质,并且b整除a,则存在x,有a/b = a*x(mod m),即a/b模m的结果和a*x模m的结果是相同的,这个x称为b的模m的乘法逆元,记作b^(-1) (mod m)

  可得b*b^(-1) = 1(mod m)

  那么当m是质数时,根据费马小定理,有b^(m-1)=1(mod m),那么b的逆元就是b^(m-2)

  如果只是保证b,m互质,那么解同余方程b*x=1(mod m)可以求出x

所以当遇到除法取模运算时,可以先求出逆元,转换成乘法取模运算

/*
如果单独是个A,那么就可以分解质因数后用公式求约数个数
那么B个A相乘,其约数个数就是mul{1+p^1+p^2...+p^B*ci}
结果是比数列求和后再相乘,每项等比数列的结果是
(pi^(B*ci+1)-1)/(pi-1) mod9901,
1.pi-1不是9901的倍数,(pi-1)^(9901-2)就是逆元
2.pi-1是9901的倍数,逆元不存在,但是pi mod 9901=1。。。 先把A分解质因数,再等比数列求和(快速幂+逆元),
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 9901int m,p[200],c[200];
void divide(int n){m=0;for(int i=2;i*i<=n;i++)if(n%i==0){p[++m]=i,c[m]=0;while(n%i==0) n/=i,c[m]++; }if(n>1) p[++m]=n,c[m]=1;
}
ll pow(ll a,ll b){ll res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}int main(){ll a,b,ans=1;scanf("%lld%lld",&a,&b);divide(a);//分解质因数for(int i=1;i<=m;i++){if((p[i]-1)%mod==0){ans=ans*(b*c[i]+1)%mod;continue;}//求分子和分母逆元 ll x=pow(p[i],b*c[i]+1)%mod;x=(x-1+mod)%mod;ll y=pow(p[i]-1,mod-2)%mod;ans=ans*x%mod*y%mod; }printf("%lld\n",ans);
}

求解同余方程:a*x=b(mod m)等价于a*x-b是m的倍数,等价于a*x+m*y=b,当gcd(a,m)|b时,有解

按照拓展欧几里得算法,可解得特解x=x0*b/gcd(a,m)就是原线性同余方程的一个解

  通解为所有模m/gcd(a,m)与x同余的整数

求解同余方程:noip2012:a*x=1(mod b)的最小整数解

#include<bits/stdc++.h>
using namespace std;
#define ll long longll a,b,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll d=exgcd(b,a%b,x,y);ll z=x; x=y,y=z-y*(a/b);return d;
}
int main(){cin >> a >> b;exgcd(a,b,x,y);//x可能是负数 cout << (x%b+b)%b<<endl;
}

转载于:https://www.cnblogs.com/zsben991126/p/10238553.html

扩展欧几里得,解线性同余方程 逆元 poj1845相关推荐

  1. CodeForces - 724C Ray Tracing(扩展欧几里得解方程)

    题目链接:点击查看 题目大意:在 n∗mn*mn∗m 的矩阵中,从点 (0,0)(0,0)(0,0) 发射一个小球,以四十五度的方向出发,速度是 2\sqrt{2}2​,当碰到壁时,会进行反射:当碰到 ...

  2. 扩展欧几里得 解方程小记

    本来以前学习的时候就懵懵懂懂,长时间不用就完全不会了.. 首先对于扩展欧几里得,对于最一般的方程形式 ax+by=gcd(a,b),此方程一定有整数解,扩展欧几里便得能够求出其中的一组整数解x0,y0 ...

  3. HDU 5514 Collision(扩展欧几里得+解方程)——2014ACM/ICPC亚洲区北京站

    传送门 Matt is playing a naive computer game with his deeply loved pure girl. The playground is a recta ...

  4. 欧几里得定理与扩展欧几里得

    3,欧几里德定理:(射影定理) 定理指出素数是无限的. a*b*c+1要么是素数要么其质因子就是素数. 扩展欧几里得: 扩展欧几里得算法是欧几里得(又叫辗转相除法)的扩展.已知整数a.b,扩展欧几里得 ...

  5. 求解线性同余方程--扩展欧几里得

    资料来源:https://blog.csdn.net/ //求解ax=b(mod m) 返回0为无解,否则返回gcd(a,m)个mod m意义下的解,用X[]存 int mod(int a, int ...

  6. 专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程

    初见安~这里是基础数论专题(3)~[详见数论专栏] p.s:本文章假设你已经掌握了欧几里得算法--辗转相除法求最大公约数(gcd) 一.二元一次方程 形如的含有两个未知数且最高次数为1的方程我们称之为 ...

  7. 求逆元(线性求逆元)及其扩展欧几里得

    线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...

  8. 扩展欧几里得求多组解CodeForces - 1244C

    扩展欧几里得求多组解 扩展欧几里得可以求得满足ax+by = c的一组解(这里c%gcd(a,b)要等于0):假如求得的解为(x0 , y0),G = gcd(a , b),这时我们可以发现(x0 + ...

  9. 扩展欧几里得定理详解和运用(就不信你看不懂!)

    1 :扩展欧几里得内容: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by =c.(若 c%gcd(a,b)!=0)则无解 所以 我们求ax+by=c是不是可以转化为求 ax+by=k ...

最新文章

  1. centos6.5编译安装php7
  2. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)
  3. 学习笔记(31):Python网络编程并发编程-定时器
  4. Laravel核心解读 -- 事件系统
  5. java提交表单后页面不刷新_表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交(急!!谢谢!)...
  6. postman使用之二:数据同步和创建测试集
  7. HDU1716 排列2【全排列+输出格式】
  8. JDK8相对于JDK7的一些新特性
  9. Alpha 完结撒花 —— 事后诸葛亮
  10. WEB-JSPELJSTL
  11. IDEA中的TODO使用和Debug史诗级详细使用说明
  12. 聊聊两个状态管理库 Redux Recoil
  13. 通达信口袋支点选股公式,选出口袋支点形态
  14. Idea Debug 窗口所有按钮详解
  15. thinkpad T480s使用体验
  16. Android之获取手机内部及sdcard存储空间
  17. ios 获取电量百分比_iOS 获取电池电量
  18. 初学计算机图形学——OpenGL实现二维图形平移,旋转(不使用opengl自带的函数,齐次方程实现)
  19. 学人工智能需要什么配置的电脑?AI电脑配置需求
  20. 网页在线倍速播放视频神器enounce myspeed

热门文章

  1. 生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包
  2. 使用内存数据库的.NET Core 3.0中基于身份(Identity-Based)的身份验证
  3. C#中的通用循环缓冲区
  4. ASP.NET Core与Dapper和VS 2017使用JWT身份验证WEB API并在Angular2客户端应用程序中使用它
  5. php 获取父类名称,[typecho]获取 父级分类 名称?
  6. python fortran混编 ctypes_关于python调用fortran编译的dll的问题
  7. python 基础学习--运算符集合
  8. eslint是什么_为什么eslint没有 no-magic-string?
  9. 如何修改tomcat项目的图标
  10. linux cnc 软件手册,最新LINUXCNC源程序原理说明.docx