博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数论】【扩展欧几里得】hdu3579 Hello Kiki
阅读量:5823 次
发布时间:2019-06-18

本文共 1068 字,大约阅读时间需要 3 分钟。

解一元线性同余方程组(模数不互质)

结合看这俩blog讲得不错

http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_27599517/article/details/50887445

上面这个对于理解为什么要用最小公倍数有帮助

http://blog.csdn.net/thearcticocean/article/details/49452859

思路就是不断两两合并,成一元线性同余方程,然后不断用扩欧求解

由于是最小的正整数解,而非非负整数解,所以最后答案如果是0,要加上模数的最小公倍数

#include
using namespace std;int a[10],r[10],T,n;void exgcd(int a,int b,int &d,int &x,int &y){ if(!b) { d=a; x=1; y=0; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); }}int main(){// freopen("c.in","r",stdin); scanf("%d",&T); for(int zu=1;zu<=T;++zu){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } for(int i=1;i<=n;++i){ scanf("%d",&r[i]); } int a1=a[1],r1=r[1]; for(int i=2;i<=n;++i){ int a2=a[i],r2=r[i]; int d,x0,y0; int c=r2-r1; exgcd(a1,a2,d,x0,y0); if(c%d){ r1=-1; break; } int t=a2/d; x0=(x0*(c/d)%t+t)%t; r1=a1*x0+r1; a1=a1*(a2/d); } printf("Case %d: %d\n",zu,r1==0 ? r1+a1 : r1); } return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/6596010.html

你可能感兴趣的文章
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
ios xmpp demo
查看>>
python matplotlib 中文显示参数设置
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
Linux基础命令---rmdir
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
FreeMarker-Built-ins for strings
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>