Submission #374457

#TimeUsernameProblemLanguageResultExecution timeMemory
374457VimmerEuklid (COCI20_euklid)C++14
35 / 110
152 ms1148 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")

#define N 1005
#define NN 1005000
#define PB push_back
#define M ll(1e9 + 7)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define pri(x) cout << x << endl
#define endl '\n'
#define _ << " " <<
#define F first
#define S second

using namespace std;
//using namespace __gnu_pbds;

//typedef tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update> oredered_set;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef short int si;

int brd(int a, int b)
{
    if (b > a)
        swap(a, b);

    if (b == 1)
        return a;

    return brd(a / b, b);
}

int gc(int a, int b)
{
    if (a > b)
        swap(a, b);

    if (a == 0)
        return b;

    return gc(b, b % a);
}

pair <int, int> pt[210][210];

pair <int, int> fnd(int gc, int x)
{
    int p = (x + x) / gc;

    int r = p * gc;

    if (r == x + x)
        r -= gc;

    p = x / gc;

    int l = p * gc;

    if (l != x)
        l += gc;

    for (int y = l; y <= r; y += gc)
            {
                if (__gcd(y, x) == gc) return {y, x};

                for (int t = x * y; t < (x + 1) * y; t++)
                    if (__gcd(y, t) == gc)
                        return {y, t};
            }

    for (int y = x; y < x + x; y++)
    {
        if (y % gc == 0) continue;

        r = (y * (x + 1));

        r /= gc;

        r *= gc;

        if (r == (y * (x + 1)))
            r -= gc;

        l = (y * x) / gc;

        l *= gc;

        if (l != y * x)
            l += gc;

        for (int nx = l; nx <= r; nx += gc)
        {
            for (int t = nx * y; t < nx * (y + 1); t++)
                if (__gcd(t, nx) == gc)
                    return {nx, t};
        }
    }

    return {0, 0};
}

int main()
{
    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    //freopen("1.in", "r", stdin);

    for (int i = 1; i <= 200; i++)
        for (int j = 2; j <= 200; j++)
        {
            pt[i][j] = fnd(i, j);
        }

    for (int i = 2; i <= 1000; i++)
        for (int j = 2; j <= 1000; j++)
        {
            int gc = __gcd(i, j);

            int bd = brd(i, j);

            if (gc > 200 || bd > 200) continue;

            if (pt[gc][bd].F != 0) continue;

            pt[gc][bd] = {i, j};
        }

//    int kol = 0;
//
//    for (int i = 1; i <= 200; i++)
//        for (int j = 2; j <= 200; j++)
//            if (pt[i][j].F == 0)
//                {
//                    kol++;
//                }

//    pri(kol);

    int q;

    cin >> q;

    for (; q > 0; q--)
    {
        ll gc, bd;

        cin >> gc >> bd;

        if (gc == bd)
        {
            pri(gc _ bd);

            continue;
        }

        if (bd == 2)
        {
            pri(gc + gc _ gc);

            continue;
        }

        if (gc == bd && bd == 1)
        {
            pri(3 _ 2);

            continue;
        }

        if (bd * bd == gc)
        {
            pri(gc _ bd * gc);

            continue;
        }

        if (pt[gc][bd].F != 0)
            pri(pt[gc][bd].F _ pt[gc][bd].S);
            else
        {
            pair <int, int> pt = fnd(gc, bd);

            if (pt.F == 0)
                assert(0);

            pri(pt.F _ pt.S);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...