【数论】【扩展欧几里得】hdu3579 Hello Kiki
2024-09-25 04:00:39
解一元线性同余方程组(模数不互质)
结合看这俩blog讲得不错
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_27599517/article/details/50887445
上面这个对于理解为什么要用最小公倍数有帮助
http://blog.csdn.net/thearcticocean/article/details/49452859
思路就是不断两两合并,成一元线性同余方程,然后不断用扩欧求解
由于是最小的正整数解,而非非负整数解,所以最后答案如果是0,要加上模数的最小公倍数
#include<cstdio>
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;
}
最新文章
- Qt界面中嵌入其他exe程序的界面,使用Qt5
- 【JavaScript中的正则表达式】
- UML之类图
- python 100例 (持续更新)
- 在linux下安装Xwindows
- 《APUE》第五章笔记
- web工程中spring+ibatis的单元测试--转载
- PHP获得文件的md5并检验是否被修改
- 《算法问题实战策略》-chaper8-动态规划法
- RESTful API -备
- maven问题:org.springframewor.web.filter.CharacterEncodingFileter不能强转为javax.servlet.Filter
- struts2-第一章-基础用法3
- 基于WanAndroid开放API实现的文章阅读APP
- oo第3次博客作业
- python3+cv2+andiord安卓摄像头
- iOS 开发:绘制像素到屏幕
- 进程表示之进程ID号
- 6--Python入门--Python基本运算符
- ASP.NET Request.Cookies获取某个Cookie的奇怪问题
- 转 git push 提示 Everything up-to-date