結果

問題 No.2183 LCA on Rational Tree
ユーザー vwxyzvwxyz
提出日時 2024-06-02 04:32:55
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,170 bytes
コンパイル時間 1,249 ms
コンパイル使用メモリ 133,292 KB
実行使用メモリ 13,752 KB
最終ジャッジ日時 2024-06-02 04:33:02
合計ジャッジ時間 7,081 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 TLE -
testcase_02 TLE -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

const long long M=1LL<<60;

long long gcd(long long a,long long b){
    if(a>b){
        return gcd(b,a);
    }
    if(a==0){
        return b;
    }
    return gcd(b%a,a);
}
vector<long long> Divisors(long long N) {
    vector<long long> divisors;
    long long i;
    for (i = 1; i * i < N; ++i) {
        if (N % i == 0) {
            divisors.push_back(i);
        }
    }
    if (i * i == N) {
        divisors.push_back(i);
    }
    for (--i; i > 0; --i) {
        if (N % i == 0) {
            divisors.push_back(N / i);
        }
    }
    return divisors;
}

vector<tuple<long long, long long, long long>> f(long long p, long long q, const vector<long long>& D) {
    if (q - p == 1) {
        return { make_tuple(1, p, M) };
    }
    vector<tuple<long long, long long, long long>> lst;
    vector<long long> mods;
    for (size_t i = 1; i < D.size(); ++i) {
        long long d = D[i];
        if ((q - p) % d == 0) {
            mods.push_back((d+(-p) % d)%d);
        }
    }
    long long mi = *min_element(mods.begin(), mods.end());
    long long pp = p + mi;
    long long qq = q + mi;
    long long g = gcd(pp, qq);
    lst.push_back(make_tuple(q - p, p, pp));
    vector<tuple<long long, long long, long long>> sub_lst = f(pp / g, qq / g, D);
    lst.insert(lst.end(), sub_lst.begin(), sub_lst.end());
    return lst;
}

vector<tuple<long long, long long, long long>> tree(long long p, long long q) {
    vector<long long> D = Divisors(q - p);
    return f(p, q, D);
}

int main() {
    int Q;
    cin >> Q;
    for (int q = 0; q < Q; ++q) {
        long long a, b, c, d;
        cin >> a >> b >> c >> d;
        vector<tuple<long long, long long, long long>> tree0 = tree(a, b);
        vector<tuple<long long, long long, long long>> tree1 = tree(c, d);

        unordered_map<long long, vector<pair<long long, long long>>> dct;
        for (const auto& [d, a, b] : tree0) {
            dct[d].emplace_back(a, b);
        }
        for (const auto& [d, a, b] : tree1) {
            dct[d].emplace_back(a, b);
        }
    }

    return 0;
}


0