Submission #1210925

#TimeUsernameProblemLanguageResultExecution timeMemory
1210925sqrtxsunlightHack (APIO25_hack)C++20
100 / 100
54 ms964 KiB
#include "hack.h"
#include <bits/stdc++.h>
using namespace std;

bool dntm (int l, int a, int b)
{
    vector <long long> v_ask;
    for (int i = 1; i <= a; i ++) v_ask.push_back (i);
    for (int i = a + l; i <= a * b + l; i += a) v_ask.push_back (i);

    return collisions (v_ask);
}

bool check_inside (int l, int r)
{
    int dif = r - l;
    int d = sqrt (dif + 1);

    if (d * (d + 1) > dif + 1)
    {
        if (dntm (l, d, d)) return true;
        dif -= d * d;
    }
    else
    {
        if (dntm (l, d, d + 1)) return true;
        dif -= d * (d + 1);
    }

    if (dif < 0) return false;

    d = sqrt (dif) + 1;
    return dntm (r - d * d + 1, d, d);
}

int hack()
{
    int le = 5e8, ri = 1e9;
    while (le < ri)
    {
        int mid = (le + ri) / 2;

        if (check_inside (le, mid)) ri = mid;
        else le = mid + 1;
    }

    vector <int> divs;
    for (int i = 2; i * i < le; i ++)
    {
        if (le % i == 0)
        {
            divs.push_back (i);
            divs.push_back (le / i);
        }
    }

    sort (divs.begin (), divs.end ());
    divs.push_back (le);

    int l = 0, r = divs.size () - 1;
    while (l < r)
    {
        int mid = (l + r) / 2;
        vector <long long> v_ask = {1};
        for (int i = l; i <= mid; i ++) v_ask.push_back (divs[i] + 1);

        //for (auto i: v_ask) cout << i << ' ';
        //cout << '\n';

        if (collisions (v_ask)) r = mid;
        else l = mid + 1;
    }

    return divs[l];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...