有必要重新学一下扩展GCD emmmm。

主要是扩展GCD求解线性同余方程$ax≡b (mod p)$。

1.方程有解的充分必要条件:b%gcd(a,p)=0。

  证明:

  • $ax-py=b$
  • 由于求解整数解,ax是gcd(a,p)的整数倍,py也是,所以b是gcd(a,p)的整数倍。

2.扩展GCD模板

int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1,y=0;return a;}//注意x,y的赋值。
int gcd=exgcd(b,a%b,x,y),t=x;
x=y;y=t-a/b*y;
return gcd;
}

3.求解线性同余方程:

扩展欧几里得可以求解形如$ax-py=b$的解。

方程可化为$ax≡b (mod p)$,注意b和p的位置。

令t=gcd(a,p)。方程可化为$\frac {a}{t}x-\frac{p}{t}y=\frac{b}{t}$。exgcd求出$\frac {a}{t}x-\frac{p}{t}y=1$的一组特解x,y。$x*=b/t,y*=b/t$即可求出一组解。

而要求最小整数解,可以发现如果x减p,y加a等式仍然成立,所以最小整数解为(x%p+p)%p.

int GCD(int a,int b){return !b?a:GCD(b,a%b);}
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1,y=0;return a;}
int gcd=exgcd(b,a%b,x,y),t=x;
x=y;y=t-a/b*y;
return gcd;
}
int fcc(int a,int b,int p)
{
int x,y,t=GCD(a,p);
if(b%t)return -1;
int tem=b/t;a/=t,p/=t;
exgcd(a,p,x,y);
x*=tem,y*=tem;
return (x%p+p)%p;
}

最新文章

  1. ASP.NET获取客户端IP地址
  2. Unity依赖注入使用详解
  3. Python 反编译工具uncompyle2
  4. python 守护进程 daemon
  5. Formatting Excel File Using Ole2 In Oracle Forms
  6. wsdl和wadl区别
  7. ibatis错误汇总
  8. ROS使用rqt_console
  9. c++怎样让返回对象的函数不调用拷贝构造函数
  10. CURD特性
  11. SharePoint管理中心来配置资源限制(大名单)
  12. WEB组件 开发 (未完成 4-13)
  13. 【一天一道LeetCode】#137. Single Number II
  14. 理解WebKit和Chromium: Android 4.4 上的Chromium WebView
  15. 微信公众号手机无法直接下载APK文件是怎么回事
  16. Java静态方法为什么不能访问非静态方法
  17. C#,如何程序使用正则表达式如何使用匹配的位置的结果修改匹配到的值
  18. Saltstack 命令
  19. react状态提升问题::::
  20. 面试题30:KMP 字符串查找

热门文章

  1. import schedule ImportError: No module named schedule
  2. 在多版本python的pip的安装与对应包的安装
  3. java 字符串拼接
  4. Win7x64易语言调试进程无法退出
  5. git出现“The file will have its original line endings in your working directory”错误
  6. 阿里云Global Connection亮相MWC 2019,做企业全球化开路先锋
  7. 模拟21 题解(waiting)
  8. git操作github指令
  9. iOS项目转移到自动引用计数
  10. js判断类型为数字的方法实现总汇——原生js判断isNumber()