题意:
已知x和k,求p和q。
算法:
就是扩展欧几里得的运用。
先求出ax+by = gcd(a,b)的解(x0,y0)
那么令g = gcd(a,b),ax + by = c的解为 (x0*c/g,y0*c/g)
这里a = |_ x/k _|,b = 横线在上面的那个啦 [x/k]。
|_ x_|对应的是不大于x的最大整数,对应floor。
另外一个是大于或者等于x的最小整数,对应ceil。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d = a;
x = 1;
y = 0;
}
else
{
ex_gcd(b,a%b,d,y,x);
y -= x*(a/b);
}
}
int main()
{
int T;
ll x0,y0,g;
double x,k;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf",&x,&k);
ll b = (ll)ceil(x/k);
ll a = (ll)floor(x/k);
ll c = (ll)x;
ex_gcd(a,b,g,x0,y0);
ll x1 = x0*c/g,y1 = y0*c/g;
printf("%lld %lld\n",x1,y1);
}
return 0;
}