一系列等式变换后,at+bp=gcd(a,b),要求最小的t,求最小的t之前先求出一组t,p,怎么求呢
对于不完全为0的非负整数a,
b. gcd(a, b)表示a,
b 的最大公约数。那么存在整数x, y使得 gcd(a,
b) = a * x + b * y;
所以,求出x,y来,就是一组t,p,求这个用改装过的gcd
求出来后,又变化一下,恩,出结果了,并且因为都是整数,c%d要为0
求出一组t,p后找到最小的t的方法是欧几里得
欧几里得是什么,我会好好学的,现在先记录一下
#include <iostream>
#include<stdio.h>
using namespace std;
void gcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
gcd(b,a%b,d,y,x);
y=y-x*(a/b);
}
}
int main()
{
long long x,y,m,n,l,a,c,b,d=0;
while(~(scanf("%lld %lld %lld %lld %lld",&x,&y,&n,&m,&l)))
{
a=m-n;
c=x-y;
b=l;
gcd(a,b,d,x,y);
if(c%d)
cout << "Impossible" << endl;
else
{
x=(x*c/d)%(b/d);
if(x<0)
x=x+b/d;
cout<<x<<endl;
}
}
return 0;
}