Submission #1354983

#TimeUsernameProblemLanguageResultExecution timeMemory
1354983wibulordHack (APIO25_hack)C++20
100 / 100
83 ms2056 KiB
#include "hack.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

static bool has_collision(const vector<ll>& a, const vector<ll>& b) {
    vector<ll> q;
    q.reserve(a.size() + b.size());
    for (ll x : a) q.push_back(x);
    for (ll x : b) q.push_back(x);
    return collisions(q) > 0;
}

int hack() {
    const ll P = 14009;
    const ll L = 500000000LL;
    const ll R = 1000000000LL;

    // A = {1, 2, ..., P}
    vector<ll> A(P);
    iota(A.begin(), A.end(), 1);

    // B = consecutive multiples of P covering [L, R]
    vector<ll> B;
    ll start = (L / P) * P;
    for (ll x = start; x <= R + P; x += P) {
        B.push_back(x);
    }

    vector<ll> V = A, U = B;

    // Invariant: V ∪ U contains at least one colliding pair
    while (V.size() > 1 || U.size() > 1) {
        if (V.size() < U.size()) swap(V, U);

        size_t mid = V.size() / 2;
        vector<ll> right(V.begin() + mid, V.end());

        if (has_collision(right, U)) {
            V = move(right);
        } else {
            V.resize(mid);
        }
    }

    ll X = llabs(V[0] - U[0]); // X is a positive multiple of n

    // Remove redundant prime factors from X until it becomes exactly n
    ll ans = X;
    ll tmp = X;

    for (ll p = 2; p * p <= tmp; ++p) {
        if (tmp % p != 0) continue;

        while (tmp % p == 0) tmp /= p;

        while (ans % p == 0) {
            ll cand = ans / p;
            if (collisions({1, cand + 1}) > 0) {
                ans = cand; // still divisible by n
            } else {
                break;
            }
        }
    }

    if (tmp > 1) {
        while (ans % tmp == 0) {
            ll cand = ans / tmp;
            if (collisions({1, cand + 1}) > 0) {
                ans = cand;
            } else {
                break;
            }
        }
    }

    return (int)ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...