您的位置:首页 > 其它

当我真正理解了扩展欧几里得定理

2011-09-02 22:29 211 查看
首先、扩展欧几里得定理:对于两个不全为0的整数a、b,必存在一组解x,y,使得ax+by==gcd(a,b);

实现如下:

View Code

#include<iostream>
#include<string>
usingnamespace std;

__int64 b,b1,c,c1,d,x,y,A,B,C;

__int64 gcd(__int64 a,__int64 b)
{
__int64 d,t;
if(!b)
{
x=1;
y=0;
return a;
}
d=gcd(b,a%b);
t=x;
x=y;
y=t-(a/b)*y;
return d;
}

int main()
{
int k,i,flag;
freopen("in.txt","r",stdin);
while(scanf("%d",&k)!=EOF)
{
flag=0;
scanf("%I64d%I64d",&b,&c);
if(k==1)
{
printf("%I64d\n",b+c);
continue;
}
for(i=1;i<k;i++)
{
scanf("%I64d%I64d",&b1,&c1);
if(flag)
continue;
A=b; B=b1; C=c1-c;
d=gcd(A,B);
if(C%d!=0)
{
flag=1;
continue;
}
x=x*C/d; //取得x的最小值
x=x-(x*d/B)*(B/d);
if(x<0)
x+=B/d;
c=x*b+c; b=(b*b1)/d; //按前面的分析头两合并式子
}
if(!flag)
{
printf("%I64d\n",c);
}
else
{
printf("-1\n");
}
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: