Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <utility>
- using namespace std;
- long long gcd(long long a, long long b)
- {
- if(b == 0)return a;
- else gcd(b, a%b);
- }
- pair<long long, long long> eucl(long long a, long long b)
- {
- pair<long long, long long> p;
- long long matr[2][3], q; ///[a 1 0]
- ///[b 0 1]
- matr[0][0] = a;
- matr[0][1] = 1;
- matr[0][2] = 0;
- matr[1][0] = b;
- matr[1][1] = 0;
- matr[1][2] = 1;
- while(1){
- if(matr[0][0] == 0){
- p.first = matr[1][1];
- p.second = matr[1][2];
- return p;
- }
- else if(matr[1][0] == 0){
- p.first = matr[0][1];
- p.second = matr[0][2];
- return p;
- }
- if(a > b){
- q = a/b;
- matr[0][0] -= matr[1][0]*q;
- matr[0][1] -= matr[1][1]*q;
- matr[0][2] -= matr[1][2]*q;
- }
- else if(a < b){
- q = b/a;
- matr[1][0] -= matr[0][0]*q;
- matr[1][1] -= matr[0][1]*q;
- matr[1][2] -= matr[0][2]*q;
- }
- a = matr[0][0];
- b = matr[1][0];
- }
- }
- int main()
- {
- long long x, k, p, q, a, b, t, g;
- pair<long long, long long>pa;
- scanf("%lld", &t);
- while(t--){
- scanf("%lld %lld", &x, &k);
- a = floor(((double)x/(double)k));
- b = ceil(((double)x/(double)k));
- g = gcd(max(a, b), min(a, b));
- if(a == b){
- p = 0;
- q = 1;
- }
- else{
- pa = eucl(a, b);
- p = pa.first;
- q = pa.second;
- }
- printf("%lld %lld\n", x*p/g, x*q/g);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement