Submission #1221592

#TimeUsernameProblemLanguageResultExecution timeMemory
1221592steveonalexHack (APIO25_hack)C++20
100 / 100
74 ms1220 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ul; typedef unsigned long long ull; #define MASK(i) (1ULL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(abs(a), abs(b));} ll lcm(ll a, ll b){return abs(a) / gcd(a, b) * abs(b);} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ull mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } #include "hack.h" int get_collision(vector<ll> x){ for(auto &i: x) i++; return collisions(x); } int find_dih(int x){ const int MOD = 13756; vector<int> divisor; for(int i = 1; i * i <= x; ++i) { if (x % i == 0){ divisor.push_back(i); divisor.push_back(x / i); } } remove_dup(divisor); reverse(ALL(divisor)); while(divisor.size() && divisor.back() < MOD) divisor.pop_back(); int mi = x; vector<int> ans(divisor.size()); for(int i = 0; i < (int) divisor.size(); ++i){ bool check = true; for(int j = 0; j < i; ++j) if (divisor[j] % divisor[i] == 0 && ans[j] == 0) check = false; if (check == false) continue; ans[i] = get_collision({0, divisor[i]}); if (ans[i]) minimize(mi, divisor[i]); } return mi; } vector<ll> make_arr(int s, int len, int step){ vector<ll> cur; for(int i = 0; i < len; ++i) cur.push_back(s + i * step); return cur; } int find_lesser_mod(){ const int MOD = 117; vector<ll> first_shot; for(int i = 0; i < MOD; ++i) first_shot.push_back(i); for(int i = 1; i < MOD; ++i) first_shot.push_back(i * MOD); if (get_collision(first_shot) == 0) return -1; int l = 1, r = 13756; while(l < r){ int mid = (l + r) >> 1; vector<ll> cur; cur.push_back(0); for(int i = l; i <= mid; ++i) cur.push_back(i); if (get_collision(cur)) r = mid; else l = mid + 1; } return l; } int hack(){ const int BIG = 1e9; const int MOD = 13756; const int RMOD = BIG / MOD + 1; int less_mod = find_lesser_mod(); if (less_mod != -1) return less_mod; int l1 = 0, r1 = MOD-1; int l2 = RMOD / 2+1, r2 = RMOD; while(l1 < r1 || l2 < r2){ if (r2 - l2 > r1 - l1){ int mid = (l2 + r2 - 1) >> 1; vector<ll> cur; for(int i = l1; i <= r1; ++i) cur.push_back(i); for(int i = l2; i <= mid; ++i) cur.push_back(i * MOD); if (get_collision(cur)) r2 = mid; else l2 = mid + 1; } else{ int mid = (l1 + r1 - 1) >> 1; vector<ll> cur; for(int i = l1; i <= mid; ++i) cur.push_back(i); for(int i = l2; i <= r2; ++i) cur.push_back(i * MOD); if (get_collision(cur)) r1 = mid; else l1 = mid + 1; } } return find_dih(r2 * MOD - r1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...