제출 #1331935

#제출 시각아이디문제언어결과실행 시간메모리
1331935edoHack (APIO25_hack)C++20
0 / 100
4 ms1720 KiB
#include <bits/stdc++.h>
#include "hack.h"

using namespace std;
using ll = long long;

const int nax = 1e9;
int n_used = nax;
const int skip = 35000;
// int QQ = 0;

mt19937 rng((unsigned int)chrono::steady_clock::now().time_since_epoch().count());

// ll collisions(vector<ll> v) {
//     map<ll, ll> f;
//     for(ll &i : v) f[i % n_used]++;

//     ll q = 0;
//     for(auto &i : f) {
//         // cerr << i.first << " " << i.second << endl;
//         q += i.second * (i.second - 1) / 2;
//     }
//     return q;
// }

bool better(vector<ll> A, vector<ll> B) {
    vector<ll> tmp = A;
    for(auto &i : B) tmp.push_back(i);

    return collisions(tmp);
}

int hack() {
    vector<ll> A, B; A.reserve(skip); B.reserve(nax / 4);
    for(int i = 1; i <= skip; i++) {
        A.push_back(i);
    }
    for(int i = (nax / 2 - ((nax / 2) % skip)); i <= nax + skip; i += skip) {
        B.push_back(i);
    }

    while(A.size() > 1 || B.size() > 1) {
        if(A.size() > B.size()) {
            vector<ll> al, ar; al.reserve(A.size() / 2); ar.reserve(A.size() / 2);
            for(int i = 0; i < A.size(); i++) {
                if(i < A.size() / 2) al.push_back(A[i]);
                else ar.push_back(A[i]);
            }

            if(better(al, B))
                A = al;
            else 
                A = ar;
        }
        else {
            vector<ll> bl, br; bl.reserve(B.size() / 2); br.reserve(B.size() / 2);
            for(int i = 0; i < B.size(); i++) {
                if(i < B.size() / 2) bl.push_back(B[i]);
                else br.push_back(B[i]);
            }
            if(better(bl, A))
                B = bl;
            else 
                B = br;
        }
    }

    ll a1 = A[0];
    ll b1 = B[0];

    int d = abs(a1 - b1);
    int d2 = d;
    vector<int> primes;
    for(int i = 2; i * i <= d; i++) {
        if(d % i == 0) {
            primes.push_back(i);
            d /= i;
        }
    }
    if(d > 1) primes.push_back(d);

    for(auto &p : primes) {
        d2 /= p;
        if(collisions({1, d2 + 1}) == 0) 
            d2 *= p;
    }
    
    return d2;
}


// int main() {
//     ios::sync_with_stdio(false);
//     cin.tie(nullptr);

//     // n_used = 5;
//     // cout << collisions({2, 15, 7, 27, 8, 30});
//     n_used = 358696241;
//     for(int test = 1; test <= 10; test++) {
//         cout << n_used << "\n";
//         cout << hack() << "\n\n\n";
//         n_used = rng() % nax + 1;
//     }

//     return 0;
// }

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...