您的位置:首页 > 其它

poj1062

2015-10-02 17:16 375 查看
扩展欧几里得,注意一些小细节。

在sa+tb=L(扩展a和b,s和t是扩展出来的可变的系数)中,如果a,b同时为0的话,无论L是不是0都无法用扩展欧几里得求出正确的答案,要另求;只要a和b至少有一个不为0,则就可以用扩展欧几里得求出正确的答案。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

void exgcd(long long int *a,long long int *b,long long int p,long long int l,long long int *d){
if(l==0){
*a=1;
*b=1;
*d=p;

return;
}
else{
long long int a1,b1,d1;

exgcd(&a1,&b1,l,p%l,&d1);
*d=d1;
*a=b1;
*b=a1-p/l*b1;

return;
}
}

int main(){
long long int x,y,m,n,l;
long long int a,b;
long long int p,q;
long long int d;

scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
x=x%l;
y=y%l;

if(m>n){
p=m-n;
q=((y-x)%l+l)%l;//y-x写成了x-y
}
else{
p=n-m;
q=((x-y)%l+l)%l;//x-y写成了y-x
}

exgcd(&a,&b,p,l,&d);

if(q%d){
printf("Impossible\n");
}
else{
a=a*q/d;
if(a<0){
a=a+((-a)/(l/d)+1)*(l/d);
}
else if(a>0){
a=a%(l/d);
}

printf("%lld\n",a);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: